⚡
چالشها
۱. پیادهسازی فرمسازی پویا با حفظ یکپارچگی دادهها:** تبدیل فرمهای نمونه (Template) به نمونههای در حال اجرا (Instance) بدون ایجاد وابستگیهای مخرب و مدیریت صحیح کپیکردن فیلدها، گزینهها و دسترسیها در زمان اجرا.
۲. مدیریت گردشکار چندمرحلهای با کنترل مهلتها:** طراحی سیستمی که هر مرحله مهلت مستقل داشته باشد، تاخیرها را ثبت کند و پیشرفت کاربران را بهصورت لحظهای نمایش دهد؛ همچنین امکان برگشت (Reject) و اصلاح در سطوح مختلف (فیلد، مرحله، کل فرم) بدون از دست دادن دادهها.
۳. سیستم احراز هویت و دسترسیهای سطحبندیشده (RBAC) در لایههای مختلف:** اعمال مجوزهای دقیق روی فرمها، مراحل و حتی فیلدها بهگونهای که هر کاربر فقط دادههای مجاز خود را ببیند و پر کند؛ همراه با مدیریت همزمان نقشهای چندگانه برای هر کاربر.
۴. بهینهسازی عملکرد و نوتیفیکیشن:** کاهش تعداد درخواستهای سرور با استفاده از کش (`LocMemCache`) و مدیریت هوشمند اعلانها (فقط در صورت وجود وظیفهی جدید) بدون ارسال نوتیف اضافی، همراه با پشتیبانی از Service Worker برای اعلانهای مرورگر.
💡
راهحلها
فرمسازی پویا: ذخیرهی مستقیم `input_type` در `InstanceField` و کپی کامل متادیتا هنگام ایجاد فرم کپی برای قطع وابستگی به فرم مادر.
گردشکار و مهلتها: استفاده از `JSONField` برای ذخیرهی مهلت هر مرحله و تاریخچهی مراحل؛ متدهای `start_step` و `complete_step` برای مدیریت دقیق زمانبندی و ثبت تاخیرها.
RBAC سطحبندیشده: پیادهسازی `access_type` با گزینههای `all`، `specific_role` و `specific_user` در مدل فیلدها و بررسی دسترسی با متد `is_accessible_by` در زمان اجرا.
نوتیفیکیشن بهینه: کش کردن تعداد وظایف (`LocMemCache`) و مقایسهی `notified_task_ids` برای ارسال اعلان فقط در صورت وجود وظیفهی جدید؛ مدیریت `isFetching` در کلاینت برای جلوگیری از درخواستهای همزمان.
یکپارچهسازی دادههای قدیمی: اسکریپت `fix_instance_field_input_type` با قابلیت `--dry-run` برای بازیابی `input_type` در فرمهای کپی قبلی بدون خطر تغییرات ناخواسته.
📚
دستاوردها
توانمندسازی کاربران غیرفنی: ایجاد بستری برای تعریف فرمهای پیچیده و گردشکارهای سازمانی بدون نیاز به حتی یک خط کدنویسی که وابستگی به تیم فنی را به حداقل رسانده است.
شفافیت و کنترل کامل بر فرآیندها: پیادهسازی سیستم تایید/رد هوشمند در سه سطح (فیلد، مرحله و کل فرم) همراه با ثبت تاریخچهی کامل و نمایش پیشرفت لحظهای که مدیریت سازمان را شفافتر کرده است.
مدیریت امنیت و دسترسی در دقیقترین سطح: اجرای موفق سیستم احراز هویت مبتنی بر نقش (RBAC) که دسترسی کاربران را حتی تا سطح یک فیلد خاص کنترل میکند و امنیت دادهها را تضمین مینماید.
افزایش بهرهوری با بهینهسازی عملکرد: کاهش چشمگیر درخواستهای سرور با پیادهسازی کش هوشمند و ارسال اعلانهای لحظهای فقط در صورت وجود وظیفهی جدید، که تجربهی کاربری را روانتر ساخته است.
سازگاری با زیرساخت و فرهنگ سازمانی ایران: پشتیبانی کامل از تاریخهای شمسی، خروجیهای حرفهای (PDF، Excel) و امکان اتصال به MySQL که آن را برای سازمانهای ایرانی کاملاً کاربردی کرده است.
قابلیت ارتقا به یکپارچهسازی کامل سازمانی: طراحی ماژولار سیستم که امکان افزودن ماژولهای مالی، انبار و فروش را فراهم کرده و زیرساخت یک ایآرپی جامع را ایجاد نموده است.
🔧
نکات فنی برجسته
معماری ماژولار و جداسازی کامل لایهها: تفکیک اپلیکیشنهای dynamicform (تعریف فرم)، form_flow (اجرا و گردشکار)، form_review (تایید/رد)، reports (گزارشگیری) و account (مدیریت کاربران و نقشها) که توسعه و نگهداری را بسیار آسان کرده است.
قطع وابستگیهای مخرب با ذخیرهسازی مستقیم متادیتا: ذخیرهی input_type و step_title مستقیماً در InstanceField بهجای ارجاع به FormInput که باعث میشود فرمهای کپی پس از تغییر یا حذف فرم مادر، کاملاً مستقل و پایدار باقی بمانند.
مدیریت گردشکار با JSONField و تراکنشهای اتمیک: استفاده از JSONField برای ذخیرهی تاریخچهی مراحل (step_history) و مهلتهای هر مرحله (step_deadlines)؛ همراه با استفاده از transaction.atomic() در ویوهای کلیدی برای تضمین یکپارچگی دادهها.
سیستم احراز هویت و دسترسی پویا در سه سطح: پیادهسازی access_type با گزینههای all، specific_role و specific_user در مدل فیلدها و متد is_accessible_by برای بررسی دسترسی در زمان اجرا؛ همراه با قابلیت نقشهای چندگانه برای هر کاربر.
بهینهسازی عملکرد با کش هوشمند و مدیریت درخواستها: استفاده از LocMemCache برای کش کردن تعداد وظایف هر کاربر (timeout=5) و پیادهسازی isFetching در سمت کلاینت برای جلوگیری از درخواستهای همزمان و کاهش بار سرور.
سیستم نوتیفیکیشن پیشرفته با Service Worker: ثبت sw.js و استفاده از Push API برای ارسال اعلانهای مرورگر حتی در حالت بسته بودن مرورگر؛ همراه با مدیریت notified_task_ids برای جلوگیری از ارسال نوتیف تکراری.
اسکریپتهای مدیریتی یکپارچهسازی داده: اسکریپت fix_instance_field_input_type با قابلیت --dry-run و --instance-id برای بازیابی دادههای قدیمی بدون خطر تغییرات ناخواسته.
پشتیبانی از تاریخ شمسی و خروجیهای متنوع: استفاده از persiantools برای تبدیل تاریخها به شمسی در تمپلیتها و ویوها؛ همراه با خروجیگیری حرفهای (PDF با reportlab، Excel با openpyxl و xlsxwriter).
رابط کاربری واکنشگرا با دارکمود: پیادهسازی استایلهای اختصاصی برای پشتیبانی از تم تاریک ([data-bs-theme="dark"]) در تمام تمپلیتها؛ همراه با دکمههای چسبان (Sticky) در پایین صفحات برای بهبود تجربهی کاربری در موبایل.
🏗️
معماری پروژه
معماری پروژه بر پایهی Django با رویکرد ماژولار و لایهای طراحی شده است. اپلیکیشنهای مستقل شامل dynamicform (تعریف فرمهای نمونه)، form_flow (اجرا و گردشکار)، form_review (تایید/رد)، reports (گزارشگیری) و account (مدیریت کاربران و RBAC) کاملاً از هم تفکیک شدهاند تا توسعه و نگهداری را آسانتر کنند. هستهی پروژه با قطع وابستگی متادیتا (ذخیرهی مستقیم input_type و step_title در فرمهای کپی) و استفاده از JSONField برای مدیریت تاریخچه و مهلت مراحل، پایداری و انعطافپذیری بالایی دارد. همچنین سیستم احراز هویت و دسترسیها در سه سطح (فرم، مرحله و فیلد) پیادهسازی شده و با بهرهگیری از کش (LocMemCache) و Service Worker، عملکرد و تجربهی کاربری بهینهای ارائه میدهد.
📐
مقیاس پروژه
پروژه شامل ۹ اپلیکیشن مجزا، بیش از ۳۰ مدل، حدود ۵۰ ویو و ۴۰+ تمپلیت است که در مجموع بیش از ۱۰,۰۰۰ خط کد (شامل بکاند، فرانتاند و اسکریپتهای مدیریتی) را پوشش میدهد. این سیستم با پشتیبانی از ۱۸ نوع فیلد، مدیریت فرمهای چندمرحلهای با مهلتهای مجزا، سیستم تایید/رد در سه سطح و دسترسیهای مبتنی بر نقش، برای سازمانهای متوسط تا بزرگ (۱۰۰ تا ۵۰۰+ کاربر همزمان) طراحی شده و قابلیت ارتقا به ایآرپی کامل با ماژولهای مالی، انبار و فروش را دارد.