From bcdad02274cd7bad5cde5f93652e2ec5cf6338bb Mon Sep 17 00:00:00 2001
From: ABDALRAHMAN MOLOOD <sudaneseh@gmail.com>
Date: Mon, 5 Aug 2024 15:47:25 +0300
Subject: [PATCH 01/11] Create arabic.json

- add arabic translation
---
 system/lan/arabic.json | 719 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 719 insertions(+)
 create mode 100644 system/lan/arabic.json

diff --git a/system/lan/arabic.json b/system/lan/arabic.json
new file mode 100644
index 00000000..d052069a
--- /dev/null
+++ b/system/lan/arabic.json
@@ -0,0 +1,719 @@
+{
+  "Log_in": "تسجيل الدخول",
+  "Register": "تسجيل",
+  "Announcement": "إعلان",
+  "Registration_Info": "معلومات التسجيل",
+  "Voucher_not_found__please_buy_voucher_befor_register": "القسيمة غير موجودة، يرجى شراء القسيمة قبل التسجيل",
+  "Register_Success__You_can_login_now": "تم التسجيل بنجاح! يمكنك تسجيل الدخول الآن",
+  "Log_in_to_Member_Panel": "تسجيل الدخول إلى لوحة الأعضاء",
+  "Register_as_Member": "التسجيل كعضو",
+  "Enter_Admin_Area": "دخول منطقة الإدارة",
+  "PHPNuxBill": "PHPNuxBill",
+  "Username": "اسم المستخدم",
+  "Password": "كلمة المرور",
+  "Passwords_does_not_match": "كلمات المرور غير متطابقة",
+  "Account_already_axist": "الحساب موجود بالفعل",
+  "Manage": "إدارة",
+  "Submit": "إرسال",
+  "Save_Changes": "حفظ التغييرات",
+  "Cancel": "إلغاء",
+  "Edit": "تعديل",
+  "Delete": "حذف",
+  "Welcome": "مرحباً",
+  "Data_Created_Successfully": "تم إنشاء البيانات بنجاح",
+  "Data_Updated_Successfully": "تم تحديث البيانات بنجاح",
+  "Data_Deleted_Successfully": "تم حذف البيانات بنجاح",
+  "Static_Pages": "صفحات ثابتة",
+  "Failed_to_save_page__make_sure_i_can_write_to_folder_pages___i_chmod_664_pages___html_i_": "فشل في حفظ الصفحة، تأكد من أنني أستطيع الكتابة إلى مجلد الصفحات، <i>chmod 664 pages/*.html<i>",
+  "Saving_page_success": "تم حفظ الصفحة بنجاح",
+  "Sometimes_you_need_to_refresh_3_times_until_content_change": "أحيانًا تحتاج إلى التحديث ثلاث مرات حتى يتغير المحتوى",
+  "Dashboard": "لوحة التحكم",
+  "Search_Customers___": "بحث العملاء...",
+  "My_Account": "حسابي",
+  "My_Profile": "ملفي الشخصي",
+  "Settings": "الإعدادات",
+  "Edit_Profile": "تعديل الملف الشخصي",
+  "Change_Password": "تغيير كلمة المرور",
+  "Logout": "تسجيل الخروج",
+  "Services": "الخدمات",
+  "Bandwidth_Plans": "خطط عرض النطاق الترددي",
+  "Bandwidth_Name": "اسم عرض النطاق الترددي",
+  "New_Bandwidth": "عرض نطاق ترددي جديد",
+  "Edit_Bandwidth": "تعديل عرض النطاق الترددي",
+  "Add_New_Bandwidth": "إضافة عرض نطاق ترددي جديد",
+  "Rate_Download": "معدل التنزيل",
+  "Rate_Upload": "معدل الرفع",
+  "Name_Bandwidth_Already_Exist": "اسم عرض النطاق الترددي موجود بالفعل",
+  "Hotspot_Plans": "خطط هوتسبوت",
+  "PPPOE_Plans": "خطط PPPOE",
+  "Plan_Name": "اسم الخطة",
+  "New_Service_Plan": "خطة خدمة جديدة",
+  "Add_Service_Plan": "إضافة خطة خدمة",
+  "Edit_Service_Plan": "تعديل خطة الخدمة",
+  "Name_Plan_Already_Exist": "اسم الخطة موجود بالفعل",
+  "Plan_Type": "نوع الخطة",
+  "Plan_Price": "سعر الخطة",
+  "Limit_Type": "نوع الحد",
+  "Unlimited": "غير محدود",
+  "Limited": "محدود",
+  "Time_Limit": "حد زمني",
+  "Data_Limit": "حد البيانات",
+  "Both_Limit": "كلاهما",
+  "Plan_Validity": "صلاحية الخطة",
+  "Select_Bandwidth": "اختر عرض النطاق الترددي",
+  "Shared_Users": "المستخدمون المشتركين",
+  "Choose_User_Type_Sales_to_disable_access_to_Settings": "اختر نوع المستخدم المبيعات لتعطيل الوصول إلى الإعدادات",
+  "Current_Password": "كلمة المرور الحالية",
+  "New_Password": "كلمة المرور الجديدة",
+  "Administrator": "مدير",
+  "Sales": "مبيعات",
+  "Member": "عضو",
+  "Confirm_New_Password": "تأكيد كلمة المرور الجديدة",
+  "Confirm_Password": "تأكيد كلمة المرور",
+  "Full_Name": "الاسم الكامل",
+  "User_Type": "نوع المستخدم",
+  "Address": "العنوان",
+  "Created_On": "تم الإنشاء في",
+  "Expires_On": "ينتهي في",
+  "Phone_Number": "رقم الهاتف",
+  "User_deleted_Successfully": "تم حذف المستخدم بنجاح",
+  "Full_Administrator": "مدير كامل",
+  "Keep_Blank_to_do_not_change_Password": "اتركه فارغًا لعدم تغيير كلمة المرور",
+  "Keep_it_blank_if_you_do_not_want_to_show_currency_code": "اتركه فارغًا إذا كنت لا تريد عرض رمز العملة",
+  "Theme_Style": "نمط السمة",
+  "Theme_Color": "لون السمة",
+  "Default_Language": "اللغة الافتراضية",
+  "Network": "الشبكة",
+  "Routers": "الموجهات",
+  "IP_Pool": "مجمع IP",
+  "New_Router": "موجه جديد",
+  "Add_Router": "إضافة موجه",
+  "Edit_Router": "تعديل الموجه",
+  "Router_Name": "اسم الموجه",
+  "IP_Address": "عنوان IP",
+  "Router_Secret": "سر الموجه",
+  "Description": "الوصف",
+  "IP_Router_Already_Exist": "عنوان IP للموجه موجود بالفعل",
+  "Name_Pool": "اسم المجمع",
+  "Range_IP": "نطاق IP",
+  "New_Pool": "مجمع جديد",
+  "Add_Pool": "إضافة مجمع",
+  "Edit_Pool": "تعديل المجمع",
+  "Pool_Name_Already_Exist": "اسم المجمع موجود بالفعل",
+  "Refill_Account": "إعادة شحن الحساب",
+  "Recharge_Account": "إعادة شحن الحساب",
+  "Select_Account": "اختر الحساب",
+  "Service_Plan": "خطة الخدمة",
+  "Recharge": "إعادة شحن",
+  "Method": "طريقة",
+  "Account_Created_Successfully": "تم إنشاء الحساب بنجاح",
+  "Database_Status": "حالة قاعدة البيانات",
+  "Total_Database_Size": "إجمالي حجم قاعدة البيانات",
+  "Download_Database_Backup": "تحميل نسخة احتياطية من قاعدة البيانات",
+  "Table_Name": "اسم الجدول",
+  "Rows": "الصفوف",
+  "Size": "الحجم",
+  "Customer": "العميل",
+  "Add_New_Contact": "إضافة جهة اتصال جديدة",
+  "Edit_Contact": "تعديل جهة الاتصال",
+  "List_Contact": "قائمة جهات الاتصال",
+  "Manage_Contact": "إدارة جهات الاتصال",
+  "Reports": "التقارير",
+  "Daily_Reports": "التقارير اليومية",
+  "Period_Reports": "تقارير الفترة",
+  "All_Transactions": "جميع المعاملات",
+  "Total_Income": "إجمالي الدخل",
+  "All_Transactions_at_Date": "جميع المعاملات في التاريخ",
+  "Export_for_Print": "تصدير للطباعة",
+  "Print": "طباعة",
+  "Export_to_PDF": "تصدير إلى PDF",
+  "Click_Here_to_Print": "انقر هنا للطباعة",
+  "You_can_use_html_tag": "يمكنك استخدام وسم HTML",
+  "Date_Format": "تنسيق التاريخ",
+  "Income_Today": "الدخل اليوم",
+  "Income_This_Month": "الدخل هذا الشهر",
+  "Users_Active": "المستخدمون النشطون",
+  "Total_Users": "إجمالي المستخدمين",
+  "Users": "المستخدمون",
+  "Edit_User": "تعديل المستخدم",
+  "Last_Login": "آخر تسجيل دخول",
+  "Administrator_Users": "مستخدمو المدير",
+  "Manage_Administrator": "إدارة المدير",
+  "Add_New_Administrator": "إضافة مدير جديد",
+  "Localisation": "الموقع",
+  "Backup_Restore": "النسخ الاحتياطي / الاستعادة",
+  "General_Settings": "الإعدادات العامة",
+  "Date": "التاريخ",
+  "Login_Successful": "تم تسجيل الدخول بنجاح",
+  "Failed_Login": "فشل تسجيل الدخول",
+  "Settings_Saved_Successfully": "تم حفظ الإعدادات بنجاح",
+  "User_Updated_Successfully": "تم تحديث المستخدم بنجاح",
+  "User_Expired__Today": "انتهت صلاحية المستخدم، اليوم",
+  "Activity_Log": "سجل النشاطات",
+  "View_Reports": "عرض التقارير",
+  "View_All": "عرض الكل",
+  "Number_of_Vouchers": "عدد القسائم",
+  "Length_Code": "طول الكود",
+  "Code_Voucher": "كود القسيمة",
+  "Voucher": "قسيمة",
+  "Hotspot_Voucher": "قسيمة هوتسبوت",
+  "Status_Voucher": "حالة القسيمة",
+  "Add_Vouchers": "إضافة قسائم",
+  "Create_Vouchers_Successfully": "تم إنشاء القسائم بنجاح",
+  "Generate": "توليد",
+  "Print_side_by_side__it_will_easy_to_cut": "اطبع جنبًا إلى جنب، سيكون من السهل قصها",
+  "From_Date": "من التاريخ",
+  "To_Date": "إلى التاريخ",
+  "New_Service": "خدمة جديدة",
+  "Type": "نوع",
+  "Finish": "إنهاء",
+  "Application_Name__Company_Name": "اسم التطبيق / اسم الشركة",
+  "This_Name_will_be_shown_on_the_Title": "سيتم عرض هذا الاسم في العنوان",
+  "Next": "التالي",
+  "Last": "الأخير",
+  "Timezone": "المنطقة الزمنية",
+  "Decimal_Point": "الفاصلة العشرية",
+  "Thousands_Separator": "فاصل الآلاف",
+  "Currency_Code": "رمز العملة",
+  "Order_Voucher": "طلب قسيمة",
+  "Voucher_Activation": "تفعيل القسيمة",
+  "List_Activated_Voucher": "قائمة القسائم المفعلة",
+  "Enter_voucher_code_here": "أدخل رمز القسيمة هنا",
+  "Private_Message": "رسالة خاصة",
+  "Inbox": "البريد الوارد",
+  "Outbox": "البريد الصادر",
+  "Compose": "إنشاء",
+  "Send_to": "إرسال إلى",
+  "Title": "العنوان",
+  "Message": "الرسالة",
+  "Your_Account_Information": "معلومات حسابك",
+  "Welcome_to_the_Panel_Members_page__on_this_page_you_can_": "مرحبًا بك في صفحة أعضاء اللوحة، في هذه الصفحة يمكنك:",
+  "Invalid_Username_or_Password": "اسم المستخدم أو كلمة المرور غير صالحة",
+  "You_do_not_have_permission_to_access_this_page": "ليس لديك إذن للوصول إلى هذه الصفحة",
+  "Incorrect_Current_Password": "كلمة المرور الحالية غير صحيحة",
+  "Password_changed_successfully__Please_login_again": "تم تغيير كلمة المرور بنجاح، يرجى تسجيل الدخول مرة أخرى",
+  "All_field_is_required": "جميع الحقول مطلوبة",
+  "Voucher_Not_Valid": "القسيمة غير صالحة",
+  "Activation_Vouchers_Successfully": "تم تفعيل القسائم بنجاح",
+  "Data_Not_Found": "لم يتم العثور على البيانات",
+  "Search_by_Username": "البحث حسب اسم المستخدم",
+  "Search_by_Name": "البحث حسب الاسم",
+  "Search_by_Code_Voucher": "البحث حسب كود القسيمة",
+  "Search": "بحث",
+  "Select_a_customer": "اختر عميلاً",
+  "Select_Routers": "اختر الموجهات",
+  "Select_Plans": "اختر الخطط",
+  "Select_Pool": "اختر المجمع",
+  "Hrs": "ساعات",
+  "Mins": "دقائق",
+  "Days": "أيام",
+  "Months": "أشهر",
+  "Add_Language": "إضافة لغة",
+  "Language_Name": "اسم اللغة",
+  "Folder_Name": "اسم المجلد",
+  "Translator": "المترجم",
+  "Language_Name_Already_Exist": "اسم اللغة موجود بالفعل",
+  "Payment_Gateway": "بوابة الدفع",
+  "Community": "المجتمع",
+  "1_user_can_be_used_for_many_devices_": "هل يمكن استخدام مستخدم واحد للعديد من الأجهزة؟",
+  "Cannot_be_change_after_saved": "لا يمكن تغييرها بعد الحفظ",
+  "Explain_Coverage_of_router": "شرح تغطية الموجه",
+  "Name_of_Area_that_router_operated": "اسم المنطقة التي يعمل بها الموجه",
+  "Payment_Notification_URL__Recurring_Notification_URL__Pay_Account_Notification_URL": "عنوان URL لإشعار الدفع، عنوان URL لإشعار المتكرر، عنوان URL لإشعار دفع الحساب",
+  "Finish_Redirect_URL__Unfinish_Redirect_URL__Error_Redirect_URL": "عنوان URL لإعادة التوجيه بعد الانتهاء، عنوان URL لإعادة التوجيه بعد عدم الانتهاء، عنوان URL لإعادة التوجيه عند حدوث خطأ",
+  "Status": "الحالة",
+  "Plan_Not_found": "الخطة غير موجودة",
+  "Failed_to_create_transaction_": "فشل في إنشاء المعاملة.",
+  "Seller_has_not_yet_setup_Xendit_payment_gateway": "البائع لم يقم بعد بإعداد بوابة الدفع Xendit",
+  "Admin_has_not_yet_setup_Xendit_payment_gateway__please_tell_admin": "المدير لم يقم بعد بإعداد بوابة الدفع Xendit، يرجى إخبار المدير",
+  "You_already_have_unpaid_transaction__cancel_it_or_pay_it_": "لديك معاملة غير مدفوعة، قم بإلغائها أو دفعها.",
+  "Transaction_Not_found": "المعاملة غير موجودة",
+  "Cancel_it_": "هل تريد إلغاءها؟",
+  "expired": "منتهية الصلاحية",
+  "Check_for_Payment": "التحقق من الدفع",
+  "Transaction_still_unpaid_": "المعاملة لا تزال غير مدفوعة.",
+  "Paid_Date": "تاريخ الدفع",
+  "Transaction_has_been_paid_": "تم دفع المعاملة.",
+  "PAID": "مدفوع",
+  "CANCELED": "ملغي",
+  "UNPAID": "غير مدفوع",
+  "PAY_NOW": "ادفع الآن",
+  "Buy_Hotspot_Plan": "شراء خطة هوتسبوت",
+  "Buy_PPOE_Plan": "شراء خطة PPOE",
+  "Package": "الحزمة",
+  "Order_Internet_Package": "طلب حزمة إنترنت",
+  "Unknown_Command_": "أمر غير معروف.",
+  "Checking_payment": "التحقق من الدفع",
+  "Create_Transaction_Success": "تم إنشاء المعاملة بنجاح",
+  "You_have_unpaid_transaction": "لديك معاملة غير مدفوعة",
+  "TripayPayment_Channel": "قناة الدفع Tripay",
+  "Payment_Channel": "قناة الدفع",
+  "Payment_check_failed_": "فشل التحقق من الدفع.",
+  "Order_Package": "طلب الحزمة",
+  "Transactions": "المعاملات",
+  "Payments": "المدفوعات",
+  "History": "التاريخ",
+  "Order_History": "تاريخ الطلبات",
+  "Gateway": "البوابة",
+  "Date_Done": "تاريخ الإنجاز",
+  "Unpaid_Order": "طلب غير مدفوع",
+  "Payment_Gateway_Not_Found": "لم يتم العثور على بوابة الدفع",
+  "Payment_Gateway_saved_successfully": "تم حفظ بوابة الدفع بنجاح",
+  "ORDER": "طلب",
+  "Package_History": "تاريخ الحزم",
+  "Buy_History": "تاريخ الشراء",
+  "Activation_History": "تاريخ التفعيل",
+  "Buy_Package": "شراء حزمة",
+  "Email": "البريد الإلكتروني",
+  "Company_Footer": "تذييل الشركة",
+  "Will_show_below_user_pages": "سيظهر أسفل صفحات المستخدم",
+  "Request_OTP": "طلب رمز التحقق",
+  "Verification_Code": "رمز التحقق",
+  "SMS_Verification_Code": "رمز التحقق عبر الرسائل القصيرة",
+  "Please_enter_your_email_address": "يرجى إدخال عنوان بريدك الإلكتروني",
+  "Failed_to_create_Paypal_transaction_": "فشل في إنشاء معاملة Paypal.",
+  "Plugin": "الإضافة",
+  "Plugin_Manager": "مدير الإضافات",
+  "User_Notification": "إشعار المستخدم",
+  "Expired_Notification": "إشعار انتهاء الصلاحية",
+  "User_will_get_notification_when_package_expired": "سيحصل المستخدم على إشعار عند انتهاء صلاحية الحزمة",
+  "Expired_Notification_Message": "رسالة إشعار انتهاء الصلاحية",
+  "Payment_Notification": "إشعار الدفع",
+  "User_will_get_invoice_notification_when_buy_package_or_package_refilled": "سيحصل المستخدم على إشعار بالفاتورة عند شراء حزمة أو إعادة تعبئة الحزمة",
+  "Current_IP": "عنوان IP الحالي",
+  "Current_MAC": "عنوان MAC الحالي",
+  "Login_Status": "حالة تسجيل الدخول",
+  "Login_Request_successfully": "تم طلب تسجيل الدخول بنجاح",
+  "Logout_Request_successfully": "تم طلب تسجيل الخروج بنجاح",
+  "Disconnect_Internet_": "قطع الاتصال بالإنترنت؟",
+  "Not_Online__Login_now_": "غير متصل، تسجيل الدخول الآن؟",
+  "You_are_Online__Logout_": "أنت متصل، تسجيل الخروج؟",
+  "Connect_to_Internet_": "الاتصال بالإنترنت؟",
+  "Your_account_not_connected_to_internet": "حسابك غير متصل بالإنترنت",
+  "Failed_to_create_transaction__": "فشل في إنشاء المعاملة.",
+  "Failed_to_check_status_transaction__": "فشل في التحقق من حالة المعاملة.",
+  "Disable_Voucher": "تعطيل القسيمة",
+  "Balance": "الرصيد",
+  "Balance_System": "نظام الرصيد",
+  "Enable_System": "تمكين النظام",
+  "Allow_Transfer": "السماح بالنقل",
+  "Telegram_Notification": "إشعار تليغرام",
+  "SMS_OTP_Registration": "تسجيل رمز التحقق عبر الرسائل القصيرة",
+  "Whatsapp_Notification": "إشعار واتساب",
+  "Tawk_to_Chat_Widget": "أداة الدردشة Tawk.to",
+  "Invoice": "الفاتورة",
+  "Country_Code_Phone": "رمز الهاتف للبلد",
+  "Voucher_activation_menu_will_be_hidden": "سيتم إخفاء قائمة تفعيل القسيمة",
+  "Customer_can_deposit_money_to_buy_voucher": "يمكن للعميل إيداع الأموال لشراء القسيمة",
+  "Allow_balance_transfer_between_customers": "السماح بنقل الرصيد بين العملاء",
+  "Reminder_Notification": "إشعار التذكير",
+  "Reminder_Notification_Message": "رسالة إشعار التذكير",
+  "Reminder_7_days": "تذكير 7 أيام",
+  "Reminder_3_days": "تذكير 3 أيام",
+  "Reminder_1_day": "تذكير يوم واحد",
+  "PPPOE_Password": "كلمة مرور PPPOE",
+  "User_Cannot_change_this__only_admin__if_it_Empty_it_will_use_user_password": "لا يمكن للمستخدم تغيير هذا، فقط المدير. إذا كان فارغًا، سيتم استخدام كلمة مرور المستخدم",
+  "Invoice_Balance_Message": "رسالة رصيد الفاتورة",
+  "Invoice_Notification_Payment": "إشعار دفع الفاتورة",
+  "Balance_Notification_Payment": "إشعار دفع الرصيد",
+  "Balance_Plans": "خطط الرصيد",
+  "Buy_Balance": "شراء رصيد",
+  "Price": "السعر",
+  "Validity": "الصلاحية",
+  "Disable_auto_renewal_": "تعطيل التجديد التلقائي؟",
+  "Auto_Renewal_On": "التجديد التلقائي مفعل",
+  "Enable_auto_renewal_": "تمكين التجديد التلقائي؟",
+  "Auto_Renewal_Off": "التجديد التلقائي معطل",
+  "Refill_Balance": "إعادة شحن الرصيد",
+  "Invoice_Footer": "تذييل الفاتورة",
+  "Pay_With_Balance": "الدفع بالرصيد",
+  "Pay_this_with_Balance__your_active_package_will_be_overwrite": "ادفع هذا بالرصيد؟ سيتم الكتابة فوق الحزمة النشطة الخاصة بك",
+  "Success_to_buy_package": "تم شراء الحزمة بنجاح",
+  "Auto_Renewal": "التجديد التلقائي",
+  "View": "عرض",
+  "Back": "العودة",
+  "Active": "نشط",
+  "Transfer_Balance": "نقل الرصيد",
+  "Send_your_balance_": "إرسال رصيدك؟",
+  "Send": "إرسال",
+  "Cannot_send_to_yourself": "لا يمكن الإرسال إلى نفسك",
+  "Sending_balance_success": "تم إرسال الرصيد بنجاح",
+  "From": "من",
+  "To": "إلى",
+  "insufficient_balance": "رصيد غير كافٍ",
+  "Send_Balance": "إرسال الرصيد",
+  "Received_Balance": "الرصيد المستلم",
+  "Minimum_Balance_Transfer": "الحد الأدنى لنقل الرصيد",
+  "Minimum_Transfer": "الحد الأدنى للنقل",
+  "Company_Logo": "شعار الشركة",
+  "Expired_IP_Pool": "مجمع IP منتهي الصلاحية",
+  "Proxy": "الوكيل",
+  "Proxy_Server": "خادم الوكيل",
+  "Proxy_Server_Login": "تسجيل دخول خادم الوكيل",
+  "Hotspot_Plan": "خطة هوتسبوت",
+  "PPPOE_Plan": "خطة PPPOE",
+  "UNKNOWN": "غير معروف",
+  "Are_You_Sure_": "هل أنت متأكد؟",
+  "Success_to_send_package": "تم إرسال الحزمة بنجاح",
+  "Target_has_active_plan__different_with_current_plant_": "الهدف لديه خطة نشطة، تختلف عن الخطة الحالية.",
+  "Recharge_a_friend": "إعادة شحن صديق",
+  "Buy_for_friend": "شراء لصديق",
+  "Buy_this_for_friend_account_": "شراء هذا لحساب صديقك؟",
+  "Review_package_before_recharge": "مراجعة الحزمة قبل الشحن",
+  "Activate": "تفعيل",
+  "Deactivate": "تعطيل",
+  "Sync": "مزامنة",
+  "Failed_to_create_PaymeTrust_transaction_": "فشل في إنشاء معاملة PaymeTrust.",
+  "Location": "الموقع",
+  "Radius_Plans": "خطط Radius",
+  "Change_title_in_user_Plan_order": "تغيير العنوان في طلب خطة المستخدم",
+  "Logs": "السجلات",
+  "Voucher_Format": "تنسيق القسيمة",
+  "Resend_To_Customer": "إعادة الإرسال للعميل",
+  "Your_friend_do_not_have_active_package": "صديقك لا يملك حزمة نشطة",
+  "Service_Type": "نوع الخدمة",
+  "Others": "أخرى",
+  "PPPoE": "PPPoE",
+  "Hotspot": "هوتسبوت",
+  "Disable_Registration": "تعطيل التسجيل",
+  "Customer_just_Login_with_Phone_number_and_Voucher_Code__Voucher_will_be_password": "العميل يسجل الدخول فقط باستخدام رقم الهاتف وكود القسيمة، ستكون القسيمة كلمة المرور",
+  "Login___Activate_Voucher": "تسجيل الدخول / تفعيل القسيمة",
+  "After_Customer_activate_voucher_or_login__customer_will_be_redirected_to_this_url": "بعد أن يقوم العميل بتفعيل القسيمة أو تسجيل الدخول، سيتم إعادة توجيه العميل إلى هذا الرابط",
+  "Voucher_Prefix": "بادئة القسيمة",
+  "Voucher_activation_success__now_you_can_login": "تم تفعيل القسيمة بنجاح، الآن يمكنك تسجيل الدخول",
+  "Buy_this__your_active_package_will_be_overwritten": "شراء هذا؟ سيتم الكتابة فوق الحزمة النشطة الخاصة بك",
+  "Pay_this_with_Balance__your_active_package_will_be_overwritten": "ادفع هذا بالرصيد؟ سيتم الكتابة فوق الحزمة النشطة الخاصة بك",
+  "Buy_this__your_active_package_will_be_overwrite": "شراء هذا؟ سيتم الكتابة فوق الحزمة النشطة الخاصة بك",
+  "Monthly_Registered_Customers": "العملاء المسجلين شهريًا",
+  "Total_Monthly_Sales": "إجمالي المبيعات الشهرية",
+  "Active_Users": "المستخدمون النشطون",
+  "All_Users_Insights": "رؤى جميع المستخدمين",
+  "SuperAdmin": "مدير النظام",
+  "Radius": "Radius",
+  "Radius_NAS": "Radius NAS",
+  "Translation": "الترجمة",
+  "Translation_saved_Successfully": "تم حفظ الترجمة بنجاح",
+  "Language_Editor": "محرر اللغة",
+  "year": "سنة",
+  "month": "شهر",
+  "week": "أسبوع",
+  "day": "يوم",
+  "hour": "ساعة",
+  "minute": "دقيقة",
+  "second": "ثانية",
+  "Attributes": "السمات",
+  "Profile": "الملف الشخصي",
+  "Phone": "الهاتف",
+  "City": "المدينة",
+  "Sub_District": "الحي",
+  "Ward": "الحي",
+  "Credentials": "بيانات الاعتماد",
+  "Agent": "الوكيل",
+  "This_Token_will_act_as_SuperAdmin_Admin": "سيعمل هذا الرمز المميز كمدير النظام / المدير",
+  "Login": "تسجيل الدخول",
+  "Expired_Action": "إجراء منتهي الصلاحية",
+  "Expired_Address_List_Name": "اسم قائمة العناوين المنتهية الصلاحية",
+  "Address_List": "قائمة العناوين",
+  "Optional": "اختياري",
+  "Generated_By": "تم إنشاؤه بواسطة",
+  "Admin": "مدير",
+  "Password_should_be_minimum_6_characters": "يجب أن تكون كلمة المرور مكونة من 6 أحرف على الأقل",
+  "Add_User": "إضافة مستخدم",
+  "Send_Notification": "إرسال إشعار",
+  "Code": "الكود",
+  "Send_To_Customer": "إرسال للعميل",
+  "Prev": "السابق",
+  "Voucher_Not_Found": "القسيمة غير موجودة",
+  "Miscellaneous": "متفرقات",
+  "OTP_Required": "رمز التحقق مطلوب",
+  "Change": "تغيير",
+  "Change_Phone_Number": "تغيير رقم الهاتف",
+  "Current_Number": "الرقم الحالي",
+  "New_Number": "الرقم الجديد",
+  "Input_your_phone_number": "أدخل رقم هاتفك",
+  "OTP": "رمز التحقق",
+  "Enter_OTP_that_was_sent_to_your_phone": "أدخل رمز التحقق الذي تم إرساله إلى هاتفك",
+  "Update": "تحديث",
+  "OTP_is_required_when_user_want_to_change_phone_number": "رمز التحقق مطلوب عندما يريد المستخدم تغيير رقم الهاتف",
+  "Rate": "المعدل",
+  "Burst": "الانفجار",
+  "Editing_Bandwidth_will_not_automatically_update_the_plan__you_need_to_edit_the_plan_then_save_again": "تحرير عرض النطاق الترددي لن يحدث تحديثًا تلقائيًا للخطة، تحتاج إلى تحرير الخطة ثم الحفظ مرة أخرى",
+  "OTP_Method": "طريقة رمز التحقق",
+  "SMS": "الرسائل القصيرة",
+  "WhatsApp": "واتساب",
+  "SMS_and_WhatsApp": "الرسائل القصيرة وواتساب",
+  "The_method_which_OTP_will_be_sent_to_user": "الطريقة التي سيتم إرسال رمز التحقق بها إلى المستخدم",
+  "Report_Viewer": "عارض التقارير",
+  "Super_Administrator": "مدير النظام الأعلى",
+  "Send_To": "إرسال إلى",
+  "Resend": "إعادة الإرسال",
+  "Alert": "تنبيه",
+  "success": "نجاح",
+  "Click_Here": "انقر هنا",
+  "danger": "خطر",
+  "Logout_Successful": "تم تسجيل الخروج بنجاح",
+  "warning": "تحذير",
+  "Users_Announcement": "إعلان للمستخدمين",
+  "Customer_Announcement": "إعلان للعملاء",
+  "1_Period___1_Month__Expires_the_20th_of_each_month": "1 فترة = 1 شهر، تنتهي في 20 من كل شهر",
+  "Period": "الفترة",
+  "Add": "إضافة",
+  "Select_Payment_Gateway": "اختر بوابة الدفع",
+  "Available_Payment_Gateway": "بوابة الدفع المتاحة",
+  "Pay_Now": "ادفع الآن",
+  "Please_select_Payment_Gateway": "يرجى اختيار بوابة الدفع",
+  "Payment_Gateway_Deleted": "تم حذف بوابة الدفع",
+  "Payment_Gateway_not_set__please_set_it_in_Settings": "بوابة الدفع غير محددة، يرجى إعدادها في الإعدادات",
+  "Failed_to_create_Transaction__": "فشل في إنشاء المعاملة.",
+  "Show_To_Customer": "عرض للعميل",
+  "Using": "باستخدام",
+  "Default": "افتراضي",
+  "Customer_Balance": "رصيد العميل",
+  "Vouchers": "القسائم",
+  "Refill_Customer": "إعادة شحن العميل",
+  "Recharge_Customer": "إعادة شحن العميل",
+  "Plans": "الخطط",
+  "PPPOE": "PPPOE",
+  "Bandwidth": "عرض النطاق الترددي",
+  "Customers": "العملاء",
+  "Actives": "النشطون",
+  "Name": "الاسم",
+  "Confirm": "تأكيد",
+  "Plan": "الخطة",
+  "Total": "الإجمالي",
+  "Current_Cycle": "الدورة الحالية",
+  "Additional_Cost": "التكلفة الإضافية",
+  "Remaining": "المتبقي",
+  "Not_Found": "غير موجود",
+  "Cash": "نقدًا",
+  "Payment_not_found": "لم يتم العثور على الدفع",
+  "If_your_friend_have_Additional_Cost__you_will_pay_for_that_too": "إذا كان لدى صديقك تكلفة إضافية، ستدفعها أيضًا",
+  "Cache_cleared_successfully_": "تم مسح الذاكرة المؤقتة بنجاح!",
+  "Paid": "مدفوع",
+  "Send_Message": "إرسال رسالة",
+  "Send_Personal_Message": "إرسال رسالة شخصية",
+  "Send_Via": "إرسال عبر",
+  "Compose_your_message___": "أنشئ رسالتك...",
+  "Use_placeholders_": "استخدم العناصر النائبة:",
+  "Customer_Name": "اسم العميل",
+  "Customer_Username": "اسم المستخدم للعميل",
+  "Customer_Phone": "هاتف العميل",
+  "Your_Company_Name": "اسم شركتك",
+  "Message_Sent_Successfully": "تم إرسال الرسالة بنجاح",
+  "Send_Bulk_Message": "إرسال رسالة مجمعة",
+  "Group": "المجموعة",
+  "All_Customers": "جميع العملاء",
+  "New_Customers": "عملاء جدد",
+  "Expired_Customers": "عملاء منتهية صلاحيتهم",
+  "Active_Customers": "العملاء النشطون",
+  "Map": "الخريطة",
+  "Customer_Location": "موقع العميل",
+  "Account_Type": "نوع الحساب",
+  "Coordinates": "الإحداثيات",
+  "Latitude_and_Longitude_coordinates_for_map_must_be_separate_with_comma____": "يجب أن تكون إحداثيات خطوط العرض والطول للخريطة مفصولة بفاصلة",
+  "Customer_Geo_Location_Information": "معلومات الموقع الجغرافي للعميل",
+  "List": "القائمة",
+  "Lists": "القوائم",
+  "Single_Customer": "عميل واحد",
+  "Bulk_Customers": "عملاء مجمعين",
+  "Message_per_time": "رسالة لكل مرة",
+  "5_Messages": "5 رسائل",
+  "10_Messages": "10 رسائل",
+  "15_Messages": "15 رسالة",
+  "20_Messages": "20 رسالة",
+  "30_Messages": "30 رسالة",
+  "40_Messages": "40 رسالة",
+  "50_Messages": "50 رسالة",
+  "60_Messages": "60 رسالة",
+  "Use_20_and_above_if_you_are_sending_to_all_customers_to_avoid_server_time_out": "استخدم 20 وما فوق إذا كنت ترسل لجميع العملاء لتجنب انتهاء مهلة الخادم",
+  "Delay": "التأخير",
+  "No_Delay": "بدون تأخير",
+  "5_Seconds": "5 ثوانٍ",
+  "10_Seconds": "10 ثوانٍ",
+  "15_Seconds": "15 ثانية",
+  "20_Seconds": "20 ثانية",
+  "Use_at_least_5_secs_if_you_are_sending_to_all_customers_to_avoid_being_banned_by_your_message_provider": "استخدم 5 ثوانٍ على الأقل إذا كنت ترسل لجميع العملاء لتجنب الحظر من مزود الرسائل الخاص بك",
+  "Testing__if_checked_no_real_message_is_sent_": "اختبار [إذا تم التحقق منه، لن يتم إرسال رسالة حقيقية]",
+  "All_fields_are_required": "جميع الحقول مطلوبة",
+  "Personal": "شخصي",
+  "Email_Notification": "إشعار البريد الإلكتروني",
+  "Router_Name___Location": "اسم الموجه / الموقع",
+  "Plan_Category": "فئة الخطة",
+  "ID": "المعرف",
+  "Internet_Plan": "خطة الإنترنت",
+  "Privacy_Policy": "سياسة الخصوصية",
+  "Terms_and_Conditions": "الشروط والأحكام",
+  "Contact": "الاتصال",
+  "will_be_replaced_with_Customer_Name": "سيتم استبداله باسم العميل",
+  "will_be_replaced_with_Customer_username": "سيتم استبداله باسم المستخدم للعميل",
+  "will_be_replaced_with_Package_name": "سيتم استبداله باسم الحزمة",
+  "will_be_replaced_with_Package_price": "سيتم استبداله بسعر الحزمة",
+  "additional_bills_for_customers": "فواتير إضافية للعملاء",
+  "will_be_replaced_with_Expiration_date": "سيتم استبداله بتاريخ انتهاء الصلاحية",
+  "Your_Company_Name_at_Settings": "اسم شركتك في الإعدادات",
+  "Your_Company_Address_at_Settings": "عنوان شركتك في الإعدادات",
+  "Your_Company_Phone_at_Settings": "هاتف شركتك في الإعدادات",
+  "Invoice_number": "رقم الفاتورة",
+  "Date_invoice_created": "تاريخ إنشاء الفاتورة",
+  "Payment_gateway_user_paid_from": "بوابة الدفع التي دفع منها المستخدم",
+  "Payment_channel_user_paid_from": "قناة الدفع التي دفع منها المستخدم",
+  "is_Hotspot_or_PPPOE": "هل هو هوتسبوت أو PPPOE",
+  "Internet_Package": "حزمة الإنترنت",
+  "Internet_Package_Prices": "أسعار حزمة الإنترنت",
+  "Receiver_name": "اسم المستلم",
+  "Username_internet": "اسم المستخدم للإنترنت",
+  "User_password": "كلمة مرور المستخدم",
+  "Expired_datetime": "تاريخ ووقت انتهاء الصلاحية",
+  "For_Notes_by_admin": "للملاحظات من قبل المدير",
+  "Transaction_datetime": "تاريخ ووقت المعاملة",
+  "Balance_Before": "الرصيد قبل",
+  "Balance_After": "الرصيد بعد",
+  "how_much_balance_have_been_send": "كم من الرصيد تم إرساله",
+  "Current_Balance": "الرصيد الحالي",
+  "Sender_name": "اسم المرسل",
+  "how_much_balance_have_been_received": "كم من الرصيد تم استلامه",
+  "Extend_Postpaid_Expiration": "تمديد انتهاء الدفع المسبق",
+  "Allow_Extend": "السماح بالتمديد",
+  "Extend_Days": "تمديد الأيام",
+  "Confirmation_Message": "رسالة التأكيد",
+  "You_are_already_logged_in": "أنت مسجل الدخول بالفعل",
+  "Extend": "تمديد",
+  "Created___Expired": "تم الإنشاء / منتهي الصلاحية",
+  "Bank_Transfer": "تحويل بنكي",
+  "Recharge_Using": "إعادة الشحن باستخدام",
+  "ago": "منذ",
+  "Disabled": "معطل",
+  "Banned": "محظور",
+  "Customer_cannot_login_again": "لا يمكن للعميل تسجيل الدخول مرة أخرى",
+  "Customer_can_login_but_cannot_buy_internet_plan__Admin_cannot_recharge_customer": "يمكن للعميل تسجيل الدخول ولكن لا يمكنه شراء خطة الإنترنت، لا يمكن للمدير إعادة شحن العميل",
+  "Don_t_forget_to_deactivate_all_active_plan_too": "لا تنسى تعطيل جميع الخطط النشطة أيضًا",
+  "Ascending": "تصاعدي",
+  "Descending": "تنازلي",
+  "Created_Date": "تاريخ الإنشاء",
+  "Inactive": "غير نشط",
+  "Suspended": "معلق",
+  "Query": "استعلام",
+  "Notes": "ملاحظات",
+  "This_account_status": "حالة هذا الحساب",
+  "Maintenance_Mode": "وضع الصيانة",
+  "Maintenance_Mode_Settings": "إعدادات وضع الصيانة",
+  "Status_": "الحالة:",
+  "End_Date_": "تاريخ الانتهاء:",
+  "Save": "حفظ",
+  "Site_is_temporarily_unavailable_": "الموقع غير متاح مؤقتًا.",
+  "Scheduled_maintenance_is_currently_in_progress__Please_check_back_soon_": "الصيانة المجدولة جارية حاليًا. يرجى التحقق مرة أخرى قريبًا.",
+  "We_apologize_for_any_inconvenience_": "نعتذر عن أي إزعاج.",
+  "The": "الـ",
+  "Team": "الفريق",
+  "Extend_Package_Expiry": "تمديد انتهاء الحزمة",
+  "No": "لا",
+  "Yes": "نعم",
+  "If_user_buy_same_internet_plan__expiry_date_will_extend": "إذا اشترى المستخدم نفس خطة الإنترنت، سيتم تمديد تاريخ انتهاء الصلاحية",
+  "Tax_System": "نظام الضرائب",
+  "Enable_Tax_System": "تمكين نظام الضرائب",
+  "Tax_will_be_calculated_in_Internet_Plan_Price": "سيتم حساب الضريبة في سعر خطة الإنترنت",
+  "Tax_Rate": "معدل الضريبة",
+  "0_5_": "0.5%",
+  "1_": "1%",
+  "1_5_": "1.5%",
+  "2_": "2%",
+  "5_": "5%",
+  "10_": "10%",
+  "Custom": "مخصص",
+  "Tax_Rates_in_percentage": "معدلات الضريبة بالنسبة المئوية",
+  "Custom_Tax_Rate": "معدل الضريبة المخصص",
+  "Enter_Custom_Tax_Rate": "أدخل معدل الضريبة المخصص",
+  "Enter_the_custom_tax_rate__e_g___3_75_for_3_75__": "أدخل معدل الضريبة المخصص (مثال: 3.75 لـ 3.75%)",
+  "Additional_Information": "معلومات إضافية",
+  "City_of_Resident": "مدينة الإقامة",
+  "District": "المنطقة",
+  "State": "الولاية",
+  "State_of_Resident": "ولاية الإقامة",
+  "Zip": "الرمز البريدي",
+  "Zip_Code": "الرمز البريدي",
+  "Local_IP": "IP المحلي",
+  "Device": "الجهاز",
+  "Expired_Internet_Plan": "خطة الإنترنت المنتهية الصلاحية",
+  "When_Expired__customer_will_be_move_to_selected_internet_plan": "عند انتهاء الصلاحية، سيتم نقل العميل إلى خطة الإنترنت المحددة",
+  "Plugin_Installer": "مثبت الإضافة",
+  "Expired_Date": "تاريخ الانتهاء",
+  "Expired": "منتهية الصلاحية",
+  "Time": "الوقت",
+  "Data": "البيانات",
+  "Category": "الفئة",
+  "later": "لاحقًا",
+  "Package_Details": "تفاصيل الحزمة",
+  "Summary": "الملخص",
+  "Devices_Not_Found": "لم يتم العثور على الأجهزة",
+  "Income_reset_date": "تاريخ إعادة ضبط الدخل",
+  "Devices": "الأجهزة",
+  "Documentation": "التوثيق",
+  "Hotspot_Auth_Method": "طريقة المصادقة لهوتسبوت",
+  "Api": "API",
+  "Http_Chap": "Http-Chap",
+  "Hotspot_Authentication_Method__Make_sure_you_have_changed_your_hotspot_login_page_": "طريقة المصادقة لهوتسبوت. تأكد من تغيير صفحة تسجيل الدخول لهوتسبوت.",
+  "Business": "الأعمال",
+  "Source": "المصدر",
+  "Destination": "الوجهة",
+  "Activate_Voucher": "تفعيل القسيمة",
+  "Voucher_invalid": "القسيمة غير صالحة",
+  "Account_Not_Found": "الحساب غير موجود",
+  "Internet_Voucher_Expired": "القسيمة الإنترنت منتهية الصلاحية",
+  "Additional_Billing": "الفواتير الإضافية",
+  "Used_Date": "تاريخ الاستخدام",
+  "Filter": "التصفية",
+  "Start_time": "وقت البدء",
+  "End_Time": "وقت الانتهاء",
+  "Internet_Plans": "خطط الإنترنت",
+  "Methods": "الطرق",
+  "Hap_Lite": "Hap Lite",
+  "balance": "الرصيد",
+  "radius": "Radius",
+  "Start_Date": "تاريخ البدء",
+  "End_Date": "تاريخ الانتهاء",
+  "New_Version_Notification": "إشعار الإصدار الجديد",
+  "Enabled": "مفعل",
+  "This_is_to_notify_you_when_new_updates_is_available": "هذا لإخطارك عندما تكون هناك تحديثات جديدة متاحة",
+  "Number": "الرقم",
+  "NAS": "NAS",
+  "MAC_Address": "عنوان MAC",
+  "Uptime": "وقت التشغيل",
+  "Upload": "الرفع",
+  "Download": "التنزيل",
+  "CPU_Load": "حمل المعالج",
+  "Temperature": "درجة الحرارة",
+  "Voltage": "الجهد الكهربائي",
+  "Wireless_Status": "حالة اللاسلكي",
+  "Interface_Status": "حالة الواجهة",
+  "Hotspot_Online_Users": "مستخدمو الهوتسبوت المتصلون",
+  "PPPoE_Online_Users": "مستخدمو PPPoE المتصلون",
+  "Traffic_Monitor": "مراقبة الحركة",
+  "Interface_Name": "اسم الواجهة",
+  "Tx__bytes_Out_": "Tx (البيانات المرسلة)",
+  "Rx__bytes_In_": "Rx (البيانات المستلمة)",
+  "Total_Usage": "إجمالي الاستخدام",
+  "Server": "الخادم",
+  "Mac_Address": "عنوان MAC",
+  "Session_Time_Left": "الوقت المتبقي للجلسة",
+  "Upload__RX_": "الرفع (RX)",
+  "Download__TX_": "التنزيل (TX)",
+  "Service": "الخدمة",
+  "Caller_ID": "معرف المتصل",
+  "Interface": "الواجهة",
+  "Last_Ip": "آخر IP",
+  "Last_Activity": "آخر نشاط",
+  "Signal_Strength": "قوة الإشارة",
+  "Tx___Rx_CCQ": "Tx / Rx CCQ",
+  "Rx_Rate": "معدل الاستلام",
+  "Tx_Rate": "معدل الإرسال",
+  "TX": "الإرسال",
+  "RX": "الاستلام",
+  "Date_Time": "التاريخ / الوقت",
+  "Topic": "الموضوع",
+  "Info": "المعلومات",
+  "Success": "نجاح",
+  "Error": "خطأ",
+  "Warning": "تحذير",
+  "Force_Logout_": "تسجيل الخروج القسري:",
+  "Disconnect": "قطع الاتصال"
+}

From 096d3ea56d9ee006e05ec7a7b6741458956002db Mon Sep 17 00:00:00 2001
From: Ibnu Maksum <ibnumaksum@gmail.com>
Date: Tue, 6 Aug 2024 09:14:36 +0700
Subject: [PATCH 02/11] getIDby customer

---
 system/devices/MikrotikPppoe.php | 53 ++++++++++++--------------------
 1 file changed, 19 insertions(+), 34 deletions(-)

diff --git a/system/devices/MikrotikPppoe.php b/system/devices/MikrotikPppoe.php
index a71a9161..486b85ce 100644
--- a/system/devices/MikrotikPppoe.php
+++ b/system/devices/MikrotikPppoe.php
@@ -32,10 +32,7 @@ class MikrotikPppoe
         global $isChangePlan;
         $mikrotik = $this->info($plan['routers']);
         $client = $this->getClient($mikrotik['ip_address'], $mikrotik['username'], $mikrotik['password']);
-        //check if customer exists
-        $printRequest = new RouterOS\Request('/ppp/secret/print');
-        $printRequest->setQuery(RouterOS\Query::where('name', $customer['username']));
-        $cid = $client->sendSync($printRequest)->getProperty('.id');
+        $cid = self::getIdByCustomer($customer, $client);
         if (empty($cid)) {
             //customer not exists, add it
             $this->addPpoeUser($client, $plan, $customer);
@@ -65,6 +62,7 @@ class MikrotikPppoe
         }
     }
 
+
     function remove_customer($customer, $plan)
     {
         $mikrotik = $this->info($plan['routers']);
@@ -130,6 +128,23 @@ class MikrotikPppoe
         );
     }
 
+    /**
+     * Function to ID by username from Mikrotik
+     */
+    function getIdByCustomer($customer, $client){
+        $printRequest = new RouterOS\Request('/ppp/secret/print');
+        $printRequest->setQuery(RouterOS\Query::where('name', $customer['username']));
+        $id = $client->sendSync($printRequest)->getProperty('.id');
+        if(empty($id)){
+            if (!empty($customer['pppoe_username'])) {
+                $printRequest = new RouterOS\Request('/ppp/secret/print');
+                $printRequest->setQuery(RouterOS\Query::where('name', $customer['pppoe_username']));
+                $id = $client->sendSync($printRequest)->getProperty('.id');
+            }
+        }
+        return $id;
+    }
+
     function update_plan($old_name, $new_plan)
     {
         $mikrotik = $this->info($new_plan['routers']);
@@ -312,36 +327,6 @@ class MikrotikPppoe
         $client->sendSync($setRequest);
     }
 
-    function setPpoeUser($client, $user, $pass)
-    {
-        $printRequest = new RouterOS\Request('/ppp/secret/print');
-        $printRequest->setArgument('.proplist', '.id');
-        $printRequest->setQuery(RouterOS\Query::where('name', $user));
-        $id = $client->sendSync($printRequest)->getProperty('.id');
-
-        $setRequest = new RouterOS\Request('/ppp/secret/set');
-        $setRequest->setArgument('numbers', $id);
-        $setRequest->setArgument('password', $pass);
-        $client->sendSync($setRequest);
-    }
-
-    function setPpoeUserPlan($client, $user, $plan)
-    {
-        global $_app_stage;
-        if ($_app_stage == 'demo') {
-            return null;
-        }
-        $printRequest = new RouterOS\Request('/ppp/secret/print');
-        $printRequest->setArgument('.proplist', '.id');
-        $printRequest->setQuery(RouterOS\Query::where('name', $user));
-        $id = $client->sendSync($printRequest)->getProperty('.id');
-
-        $setRequest = new RouterOS\Request('/ppp/secret/set');
-        $setRequest->setArgument('numbers', $id);
-        $setRequest->setArgument('profile', $plan);
-        $client->sendSync($setRequest);
-    }
-
     function removePpoeActive($client, $username)
     {
         global $_app_stage;

From 7a95d793154fc62a2fdff4e92e565213ef577dd0 Mon Sep 17 00:00:00 2001
From: Ibnu Maksum <ibnumaksum@gmail.com>
Date: Tue, 6 Aug 2024 09:21:19 +0700
Subject: [PATCH 03/11] remove customer check pppoe_username

---
 system/devices/MikrotikPppoe.php | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/system/devices/MikrotikPppoe.php b/system/devices/MikrotikPppoe.php
index 486b85ce..df55ee8e 100644
--- a/system/devices/MikrotikPppoe.php
+++ b/system/devices/MikrotikPppoe.php
@@ -51,6 +51,8 @@ class MikrotikPppoe
             }
             if (!empty($customer['pppoe_ip'])) {
                 $setRequest->setArgument('local-address', $customer['pppoe_ip']);
+            }else{
+                $setRequest->setArgument('local-address', null);
             }
             $setRequest->setArgument('profile', $plan['name_plan']);
             $setRequest->setArgument('comment', $customer['fullname'] . ' | ' . $customer['email'] . ' | ' . implode(', ', User::getBillNames($customer['id'])));
@@ -72,8 +74,14 @@ class MikrotikPppoe
             $this->add_customer($customer, $p);
         } else {
             $this->removePpoeUser($client, $customer['username']);
+            if (!empty($customer['pppoe_username'])) {
+                $this->removePpoeUser($client, $customer['pppoe_username']);
+            }
         }
         $this->removePpoeActive($client, $customer['username']);
+        if (!empty($customer['pppoe_username'])) {
+            $this->removePpoeActive($client, $customer['pppoe_username']);
+        }
     }
 
     // customer change username

From 5d6a06b6fa456c6422109baec9f91ff0f9673461 Mon Sep 17 00:00:00 2001
From: ABDALRAHMAN MOLOOD <sudaneseh@gmail.com>
Date: Mon, 5 Aug 2024 15:52:14 +0300
Subject: [PATCH 04/11] Update init.php

- add Boolean function isMysqlRadius() to check if the system is using Radius mysql or not.
---
 init.php | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/init.php b/init.php
index e5e02676..e636d04d 100644
--- a/init.php
+++ b/init.php
@@ -348,3 +348,13 @@ function displayMaintenanceMessage(): void
     $ui->display('maintenance.tpl');
     die();
 }
+
+function isMysqlRadius()
+{
+    try {
+        $record = ORM::forTable('radacct', 'radius')->find_one();
+        return $record !== false;
+    } catch (Exception $e) {
+        return false;
+    }
+}

From 95899b4ebad6af489321c48ac6b46c1ce63028ae Mon Sep 17 00:00:00 2001
From: Ibnu Maksum <ibnumaksum@gmail.com>
Date: Tue, 6 Aug 2024 10:00:35 +0700
Subject: [PATCH 05/11] check if admin change username pppoe or not

---
 system/controllers/customers.php | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

diff --git a/system/controllers/customers.php b/system/controllers/customers.php
index 5aa83e80..d1c76a31 100644
--- a/system/controllers/customers.php
+++ b/system/controllers/customers.php
@@ -524,8 +524,10 @@ switch ($action) {
             ->find_many();
 
         $oldusername = $c['username'];
-        $oldPppoePassword = $c['password'];
-        $oldPassPassword = $c['pppoe_password'];
+        $oldPppoeUsername = $c['pppoe_username'];
+        $oldPppoePassword = $c['pppoe_password'];
+        $oldPppoeIp = $c['pppoe_ip'];
+        $oldPassPassword = $c['password'];
         $userDiff = false;
         $pppoeDiff = false;
         $passDiff = false;
@@ -536,7 +538,7 @@ switch ($action) {
             }
             $userDiff = true;
         }
-        if ($oldPppoePassword != $pppoe_password) {
+        if ($oldPppoeUsername != $pppoe_username) {
             $pppoeDiff = true;
         }
         if ($password != '' && $oldPassPassword != $password) {
@@ -616,8 +618,6 @@ switch ($action) {
             if ($userDiff || $pppoeDiff || $passDiff) {
                 $turs = ORM::for_table('tbl_user_recharges')->where('customer_id', $c['id'])->findMany();
                 foreach ($turs as $tur) {
-                    $tur->username = $username;
-                    $tur->save();
                     $p = ORM::for_table('tbl_plans')->find_one($tur['plan_id']);
                     $dvc = Package::getDevice($p);
                     if ($_app_stage != 'demo') {
@@ -628,12 +628,22 @@ switch ($action) {
                                 if ($userDiff) {
                                     (new $p['device'])->change_username($p, $oldusername, $username);
                                 }
+                                if ($pppoeDiff && $tur['type'] == 'PPPOE') {
+                                    if(empty($oldPppoeUsername)){
+                                        // admin just add pppoe username
+                                        (new $p['device'])->change_username($p, $username, $pppoe_username);
+                                    }else{
+                                        (new $p['device'])->change_username($p, $oldPppoeUsername, $pppoe_username);
+                                    }
+                                }
                                 (new $p['device'])->add_customer($c, $p);
                             } else {
                                 new Exception(Lang::T("Devices Not Found"));
                             }
                         }
                     }
+                    $tur->username = $username;
+                    $tur->save();
                 }
             }
             r2(U . 'customers/view/' . $id, 's', 'User Updated Successfully');

From 2a7563f43dafec455ccdd2f79473d64451a4e474 Mon Sep 17 00:00:00 2001
From: Ibnu Maksum <ibnumaksum@gmail.com>
Date: Tue, 6 Aug 2024 10:03:49 +0700
Subject: [PATCH 06/11] if expired plan deleted, go delete customer when
 expired

---
 system/devices/MikrotikHotspot.php |  7 ++++---
 system/devices/MikrotikPppoe.php   | 12 +++++++-----
 system/devices/Radius.php          |  9 +++++----
 3 files changed, 16 insertions(+), 12 deletions(-)

diff --git a/system/devices/MikrotikHotspot.php b/system/devices/MikrotikHotspot.php
index 726d6b00..c10461bf 100644
--- a/system/devices/MikrotikHotspot.php
+++ b/system/devices/MikrotikHotspot.php
@@ -44,10 +44,11 @@ class MikrotikHotspot
         $client = $this->getClient($mikrotik['ip_address'], $mikrotik['username'], $mikrotik['password']);
         if (!empty($plan['plan_expired'])) {
             $p = ORM::for_table("tbl_plans")->find_one($plan['plan_expired']);
-            $this->add_customer($customer, $p);
-        } else {
-            $this->removeHotspotUser($client, $customer['username']);
+            if($p){
+                $this->add_customer($customer, $p);
+            }
         }
+        $this->removeHotspotUser($client, $customer['username']);
         $this->removeHotspotActiveUser($client, $customer['username']);
     }
 
diff --git a/system/devices/MikrotikPppoe.php b/system/devices/MikrotikPppoe.php
index df55ee8e..79a46f0f 100644
--- a/system/devices/MikrotikPppoe.php
+++ b/system/devices/MikrotikPppoe.php
@@ -71,13 +71,15 @@ class MikrotikPppoe
         $client = $this->getClient($mikrotik['ip_address'], $mikrotik['username'], $mikrotik['password']);
         if (!empty($plan['plan_expired'])) {
             $p = ORM::for_table("tbl_plans")->find_one($plan['plan_expired']);
-            $this->add_customer($customer, $p);
-        } else {
-            $this->removePpoeUser($client, $customer['username']);
-            if (!empty($customer['pppoe_username'])) {
-                $this->removePpoeUser($client, $customer['pppoe_username']);
+            if($p){
+                $this->add_customer($customer, $p);
+                return;
             }
         }
+        $this->removePpoeUser($client, $customer['username']);
+        if (!empty($customer['pppoe_username'])) {
+            $this->removePpoeUser($client, $customer['pppoe_username']);
+        }
         $this->removePpoeActive($client, $customer['username']);
         if (!empty($customer['pppoe_username'])) {
             $this->removePpoeActive($client, $customer['pppoe_username']);
diff --git a/system/devices/Radius.php b/system/devices/Radius.php
index 46cc2f31..0fa404a2 100644
--- a/system/devices/Radius.php
+++ b/system/devices/Radius.php
@@ -85,10 +85,11 @@ class Radius
     {
         if (!empty($plan['plan_expired'])) {
             $p = ORM::for_table("tbl_plans")->find_one($plan['plan_expired']);
-            $this->customerAddPlan($customer, $p);
-        } else {
-            $this->customerDeactivate($customer['username'], true);
+            if ($p) {
+                $this->customerAddPlan($customer, $p);
+            }
         }
+        $this->customerDeactivate($customer['username'], true);
     }
 
     public function change_username($from, $to)
@@ -469,7 +470,7 @@ class Radius
         $unitdown = ($bw['rate_down_unit'] == 'Kbps') ? 'K' : 'M';
         $unitup = ($bw['rate_up_unit'] == 'Kbps') ? 'K' : 'M';
 
-        // TODO Burst mode [ 2M/1M 256K/128K 128K/64K 1s 1 64K/32K] 
+        // TODO Burst mode [ 2M/1M 256K/128K 128K/64K 1s 1 64K/32K]
 
         if (!empty(trim($bw['burst']))) {
             // burst format: 2M/1M 256K/128K 128K/64K 1s 1 64K/32K

From a3c255e77a468b95b3eb6e974a95f6ed96425563 Mon Sep 17 00:00:00 2001
From: Ibnu Maksum <ibnumaksum@gmail.com>
Date: Tue, 6 Aug 2024 10:17:11 +0700
Subject: [PATCH 07/11] what if admin want to revert using customer username?
 now it can revert username

---
 system/controllers/customers.php | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/system/controllers/customers.php b/system/controllers/customers.php
index d1c76a31..d5828183 100644
--- a/system/controllers/customers.php
+++ b/system/controllers/customers.php
@@ -629,10 +629,14 @@ switch ($action) {
                                     (new $p['device'])->change_username($p, $oldusername, $username);
                                 }
                                 if ($pppoeDiff && $tur['type'] == 'PPPOE') {
-                                    if(empty($oldPppoeUsername)){
+                                    if(empty($oldPppoeUsername) && !empty($pppoe_username)){
                                         // admin just add pppoe username
                                         (new $p['device'])->change_username($p, $username, $pppoe_username);
+                                    }else if(empty($pppoe_username) && !empty($oldPppoeUsername)){
+                                        // admin want to use customer username
+                                        (new $p['device'])->change_username($p, $oldPppoeUsername, $username);
                                     }else{
+                                        // regular change pppoe username
                                         (new $p['device'])->change_username($p, $oldPppoeUsername, $pppoe_username);
                                     }
                                 }

From 8ab1939dd992a2c4d24f33e7d947c8d4d6052bfd Mon Sep 17 00:00:00 2001
From: Ibnu Maksum <ibnumaksum@gmail.com>
Date: Tue, 6 Aug 2024 10:17:31 +0700
Subject: [PATCH 08/11] check if pppoe customer already used by another
 customer

---
 system/controllers/customers.php | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/system/controllers/customers.php b/system/controllers/customers.php
index d5828183..b6222faa 100644
--- a/system/controllers/customers.php
+++ b/system/controllers/customers.php
@@ -540,6 +540,12 @@ switch ($action) {
         }
         if ($oldPppoeUsername != $pppoe_username) {
             $pppoeDiff = true;
+            if(ORM::for_table('tbl_customers')->where('pppoe_username', $pppoe_username)->find_one()){
+                $msg.= Lang::T('PPPoE Username already used by another customer') . '<br>';
+            }
+            if(ORM::for_table('tbl_customers')->where('username', $pppoe_username)->find_one()){
+                $msg.= Lang::T('PPPoE Username already used by another customer') . '<br>';
+            }
         }
         if ($password != '' && $oldPassPassword != $password) {
             $passDiff = true;

From cb0e77523da7bcae2affc6aec2a89c52e3454b40 Mon Sep 17 00:00:00 2001
From: Ibnu Maksum <ibnumaksum@gmail.com>
Date: Tue, 6 Aug 2024 10:19:12 +0700
Subject: [PATCH 09/11] check if customer username already used by
 pppoe_username

---
 system/controllers/customers.php | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/system/controllers/customers.php b/system/controllers/customers.php
index b6222faa..baee9405 100644
--- a/system/controllers/customers.php
+++ b/system/controllers/customers.php
@@ -532,20 +532,22 @@ switch ($action) {
         $pppoeDiff = false;
         $passDiff = false;
         if ($oldusername != $username) {
-            $cx = ORM::for_table('tbl_customers')->where('username', $username)->find_one();
-            if ($cx) {
-                $msg .= Lang::T('Account already exist') . '<br>';
+            if (ORM::for_table('tbl_customers')->where('username', $username)->find_one()) {
+                $msg .= Lang::T('Username already used by another customer') . '<br>';
+            }
+            if(ORM::for_table('tbl_customers')->where('pppoe_username', $username)->find_one()){
+                $msg.= Lang::T('Username already used by another customer') . '<br>';
             }
             $userDiff = true;
         }
         if ($oldPppoeUsername != $pppoe_username) {
-            $pppoeDiff = true;
             if(ORM::for_table('tbl_customers')->where('pppoe_username', $pppoe_username)->find_one()){
                 $msg.= Lang::T('PPPoE Username already used by another customer') . '<br>';
             }
             if(ORM::for_table('tbl_customers')->where('username', $pppoe_username)->find_one()){
                 $msg.= Lang::T('PPPoE Username already used by another customer') . '<br>';
             }
+            $pppoeDiff = true;
         }
         if ($password != '' && $oldPassPassword != $password) {
             $passDiff = true;

From 3ca43c69a8df19adb22a901675df602631493edc Mon Sep 17 00:00:00 2001
From: Ibnu Maksum <ibnumaksum@gmail.com>
Date: Tue, 6 Aug 2024 10:21:26 +0700
Subject: [PATCH 10/11] allow $pppoe_username so it will back to customer
 username

---
 system/controllers/customers.php | 12 +++++++-----
 system/lan/english.json          |  3 ++-
 2 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/system/controllers/customers.php b/system/controllers/customers.php
index baee9405..511040e3 100644
--- a/system/controllers/customers.php
+++ b/system/controllers/customers.php
@@ -541,11 +541,13 @@ switch ($action) {
             $userDiff = true;
         }
         if ($oldPppoeUsername != $pppoe_username) {
-            if(ORM::for_table('tbl_customers')->where('pppoe_username', $pppoe_username)->find_one()){
-                $msg.= Lang::T('PPPoE Username already used by another customer') . '<br>';
-            }
-            if(ORM::for_table('tbl_customers')->where('username', $pppoe_username)->find_one()){
-                $msg.= Lang::T('PPPoE Username already used by another customer') . '<br>';
+            if(!empty($pppoe_username)){
+                if(ORM::for_table('tbl_customers')->where('pppoe_username', $pppoe_username)->find_one()){
+                    $msg.= Lang::T('PPPoE Username already used by another customer') . '<br>';
+                }
+                if(ORM::for_table('tbl_customers')->where('username', $pppoe_username)->find_one()){
+                    $msg.= Lang::T('PPPoE Username already used by another customer') . '<br>';
+                }
             }
             $pppoeDiff = true;
         }
diff --git a/system/lan/english.json b/system/lan/english.json
index e775eb4f..5797a2d0 100644
--- a/system/lan/english.json
+++ b/system/lan/english.json
@@ -694,5 +694,6 @@
     "_": "-",
     "Routers_Maps": "Routers Maps",
     "Routers_Geo_Location_Information": "Routers Geo Location Information",
-    "Coverage": "Coverage"
+    "Coverage": "Coverage",
+    "PPPoE_Username_already_used_by_another_customer": "PPPoE Username already used by another customer"
 }
\ No newline at end of file

From 3b8a5ad2dcc2d1ab2765268ba83e57a02e34372b Mon Sep 17 00:00:00 2001
From: Ibnu Maksum <ibnumaksum@gmail.com>
Date: Tue, 6 Aug 2024 10:26:40 +0700
Subject: [PATCH 11/11] update CHANGELOG

---
 CHANGELOG.md | 4 ++++
 version.json | 2 +-
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 25c78165..bfb6d5ab 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,10 @@
 
 # CHANGELOG
 
+## 2024.8.6
+
+- Fix Customer pppoe username
+
 ## 2024.8.5
 
 - Add Customer Mail Inbox
diff --git a/version.json b/version.json
index 7602a143..bed772bd 100644
--- a/version.json
+++ b/version.json
@@ -1,3 +1,3 @@
 {
-    "version": "2024.8.5.1"
+    "version": "2024.8.6"
 }
\ No newline at end of file