forked from hesabix/arc
9.7 KiB
Executable file
9.7 KiB
Executable file
تحلیل انتقال کاربران عضو کسب و کار
بررسی جداول
دیتابیس قدیمی (hesabixOld)
1. جدول permission (دسترسیهای کاربران به کسب و کارها)
- تعداد رکوردها: 4,398
- ساختار:
id: int (PK)user_id: int (FK به user) - NOT NULLbid_id: int (FK به business) - NOT NULLowner: tinyint(1) - آیا کاربر owner است؟- فیلدهای boolean متعدد برای دسترسیهای مختلف:
settings,person,commodity,getpay,banks,bank_transferbuy,sell,cost,income,accounting,report,logpermission,salary,cashdesk,store,walletarchive_upload,archive_mod,archive_delete,archive_viewshareholder,cheque,inquiry,ai- و فیلدهای plugin مختلف (plug_noghre_admin, plug_repservice, و غیره)
نکته: این جدول دسترسیهای کاربران به کسب و کارها را با فیلدهای boolean نگه میدارد. هر رکورد نشان میدهد که یک کاربر چه دسترسیهایی در یک کسب و کار دارد.
2. جدول shareholder (سهامداران)
- تعداد رکوردها: 609
- ساختار:
id: int (PK)bid_id: int (FK به business) - NOT NULLperson_id: int (FK به person) - NOT NULLpercent: int - درصد سهام
نکته: این جدول برای سهامداران است، نه کاربران عضو کسب و کار. سهامداران در جدول persons با person_types شامل "سهامدار" ذخیره میشوند.
دیتابیس جدید (hesabixpy)
جدول business_permissions (کاربران عضو کسب و کار)
- تعداد رکوردها: 3 (در حال حاضر)
- ساختار:
id: int (PK)business_id: int (FK به businesses) - NOT NULLuser_id: int (FK به users) - NOT NULLbusiness_permissions: JSON - nullable (دسترسیهای کاربر در کسب و کار)created_at: datetime - NOT NULLupdated_at: datetime - NOT NULL
نکته: این جدول ارتباط بین کاربران و کسب و کارها را نگه میدارد. هر رکورد نشان میدهد که یک کاربر عضو یک کسب و کار است و چه دسترسیهایی دارد.
ساختار business_permissions (JSON)
نمونه ساختار JSON در business_permissions:
{
"join": true,
"invoices": {
"add": true,
"edit": true,
"view": true,
"draft": true,
"delete": true,
"export": true
},
"products": {
"add": true,
"edit": true,
"view": true,
"delete": true,
"export": true
},
"people": {
"add": true,
"edit": true,
"view": true,
"delete": true
},
"settings": {
"view": true,
"print": true,
"users": true,
"history": true,
"business": true
},
...
}
فیلدهای مهم:
join: نشان میدهد که کاربر عضو کسب و کار است- سایر فیلدها: دسترسیهای مختلف به بخشهای مختلف سیستم
نگاشت فیلدها
انتقال از permission → business_permissions
| فیلد قدیمی | فیلد جدید | تبدیل |
|---|---|---|
bid_id |
business_id |
نگاشت از business_id قدیمی به جدید |
user_id |
user_id |
نگاشت از user_id قدیمی به جدید |
| فیلدهای boolean | business_permissions |
تبدیل فیلدهای boolean به ساختار JSON |
| - | created_at |
datetime.utcnow() |
| - | updated_at |
datetime.utcnow() |
نکته مهم: باید فیلدهای boolean را به ساختار JSON جدید تبدیل کنیم. برای مثال:
sell = 1→{"invoices": {"add": true, "edit": true, "view": true}}buy = 1→{"transfers": {"add": true, "edit": true, "view": true}}person = 1→{"people": {"add": true, "edit": true, "view": true, "delete": true}}- و غیره
چالشها و راهحلها
1. ساختار متفاوت permission
- در دیتابیس قدیمی:
permissionبا فیلدهای boolean متعدد (owner, settings, person, commodity, sell, buy, و غیره) - در دیتابیس جدید:
business_permissionsبا فیلدbusiness_permissions(JSON با ساختار سلسلهمراتبی)
راهحل:
- باید یک تابع تبدیل بنویسیم که فیلدهای boolean قدیمی را به ساختار JSON جدید تبدیل کند
- نگاشت فیلدها:
owner = 1: کاربر owner است، نیازی به رکورد درbusiness_permissionsنداردowner = 0: کاربر عضو است، باید رکورد ایجاد شودsell = 1→invoices: {add, edit, view, delete, export}buy = 1→transfers: {add, edit, view, delete}person = 1→people: {add, edit, view, delete}commodity = 1→products: {add, edit, view, delete, export}banks = 1→bank_accounts: {add, edit, view, delete}cashdesk = 1→cash: {add, edit, view, delete}وpetty_cash: {add, edit, view, delete}cheque = 1→checks: {add, edit, view, delete, return, collect, transfer}settings = 1→settings: {view, print, users, history, business}report = 1→reports: {view, export}- و غیره
2. تکراری بودن (business_id, user_id)
- در دیتابیس قدیمی: ممکن است چند رکورد
permissionبرای یک(bid_id, user_id)وجود داشته باشد - در دیتابیس جدید: باید یک رکورد
business_permissionsبرای هر(business_id, user_id)وجود داشته باشد
راهحل:
- اگر چند رکورد
permissionبرای یک(bid_id, user_id)وجود داشت، باید آنها را merge کنیم - یا فقط یک رکورد ایجاد کنیم و بقیه را در
developer_dataذخیره کنیم
3. عدم وجود permission برای owner
- در دیتابیس قدیمی:
owner_idدر جدولbusinessذخیره میشود - در دیتابیس جدید:
owner_idدر جدولbusinessesذخیره میشود - نکته: owner نیازی به رکورد در
business_permissionsندارد (چون owner است)
4. تبدیل فیلدهای boolean به JSON
- فیلدهای boolean در دیتابیس قدیمی (owner, settings, person, commodity, sell, buy, و غیره)
business_permissionsدر دیتابیس جدید یک JSON object با ساختار سلسلهمراتبی است
راهحل:
- باید یک تابع تبدیل بنویسیم که:
- فیلدهای boolean را بخواند
- آنها را به ساختار JSON جدید تبدیل کند
- اگر فیلدی true بود، دسترسیهای مربوطه را در JSON فعال کند
- اگر فیلدی false یا NULL بود، دسترسیهای مربوطه را غیرفعال کند یا نادیده بگیرد
آمار و توزیع
دیتابیس قدیمی
- permission: 4,398 رکورد
- کسب و کارهای منحصر به فرد: 4,137
- کاربران منحصر به فرد: 3,949
- رکوردهای با
owner = 1: 4,137 (کاربران owner - نیازی به انتقال ندارند) - رکوردهای با
owner = 0: 261 (کاربران عضو - باید منتقل شوند) - موارد تکراری: 1 مورد (bid_id=407, user_id=691)
- shareholder: 609 رکورد (316 کسب و کار) - این برای سهامداران است، نه کاربران عضو
دیتابیس جدید
- business_permissions: 3 رکورد (3 کسب و کار، 3 کاربر)
مراحل اجرا
- بررسی جدول
permissionدر دیتابیس قدیمی - ایجاد mapping بین
business_idقدیمی و جدید - ایجاد mapping بین
user_idقدیمی و جدید - تبدیل
nameبه ساختار JSON (یا ذخیره در developer_data) - مدیریت موارد تکراری (merge کردن)
- انتقال
permission→business_permissions
نکات مهم
-
Owner:
- کاربران با
owner = 1در دیتابیس قدیمی، owner کسب و کار هستند - owner نیازی به رکورد در
business_permissionsندارد (چون owner است) - فقط کاربران با
owner = 0باید منتقل شوند (261 رکورد)
- کاربران با
-
سهامداران:
- سهامداران در جدول
personsباperson_typesشامل "سهامدار" ذخیره میشوند - جدول
shareholderبرای سهامداران است، نه کاربران عضو کسب و کار - سهامداران نیازی به رکورد در
business_permissionsندارند
- سهامداران در جدول
-
دسترسیها:
- ساختار دسترسیها در دیتابیس جدید بسیار پیچیدهتر است (JSON با ساختار سلسلهمراتبی)
- باید فیلدهای boolean قدیمی را به ساختار JSON جدید تبدیل کنیم
- نگاشت کامل فیلدها باید مشخص شود
-
تکراری بودن:
- فقط 1 مورد تکراری وجود دارد (bid_id=407, user_id=691)
- باید مدیریت شود (merge کردن یا انتخاب یکی)
-
فیلد join:
- در دیتابیس جدید، فیلد
join: trueدر JSON نشان میدهد که کاربر عضو کسب و کار است - باید برای همه کاربران عضو این فیلد را true قرار دهیم
- در دیتابیس جدید، فیلد