سامانهٔ یکپارچهٔ عملیات (ERP) مجموعهٔ زیبایی چندشعبهای
ERP فارسی و چندشعبهای که منابع انسانی، حسابداری، صندوق و فروش، انبار، CRM و اتوماسیون اداری را یکپارچه میکند؛ با این اصل که هر فروش، یکبار ثبت شود و همهجا بازتاب پیدا کند.
- نوع پروژه: سامانهٔ یکپارچهٔ عملیات (ERP) چندماژولی و چندشعبهای
- کارفرما: یک مجموعهٔ خدماتی زیبایی با چند شعبه (نام کارفرما بنا بر توافق محرمانه منتشر نمیشود)
- نقش سپرو وب: طراحی و پیادهسازی کامل بکاند و فرانتاند، شامل موتور فروش اتمی، جداسازی داده به تفکیک شعبه و رمزنگاری اطلاعات هویتی
- وضعیت: آمادهٔ بهرهبرداری، پیش از استقرار عملیاتی (pre-production)
مسئلهای که حل کردیم
در یک مجموعهٔ چندشعبهای، اطلاعات معمولاً در جزیرههای جدا زندگی میکنند: صندوق یک عدد میگوید، انبار عدد دیگری، حسابداری در پایان ماه با اختلاف روبهرو میشود و پورسانت کارکنان دستی محاسبه میشود. هدف پروژه حذف همین جزیرهها بود: یک سامانه که در آن ثبت یک فروش، بهطور خودکار و بدون امکان ثبت نیمهکاره، در موجودی انبار، پورسانت کارکنان، مانده صندوق، اسناد حسابداری و داشبورد مدیریتی منعکس شود.
آنچه طراحی و پیادهسازی کردیم
قلب سامانه، موتور فروش اتمی است. یک فروش در صندوق، همهچیز را در یک تراکنش واحد انجام میدهد: قفل کردن جلسهٔ صندوق، کسر موجودی کالا و همچنین کسر اقلام مصرفی خدمات بر پایهٔ فرمول مصرف، ثبت پورسانت کارکنان، بهروزرسانی مانده صندوق و ثبت رویداد برای پردازشهای بعدی. اگر هر یک از این مراحل شکست بخورد — مثلاً موجودی کافی نباشد — کل عملیات برگشت میخورد و هیچ اثر نیمهکارهای باقی نمیماند.
کارهای سنگینتر مانند ثبت اسناد دفتر کل، تازهسازی داشبورد مدیریتی و هشدارهای کمبود موجودی، به یک پردازشگر پسزمینه سپرده میشوند که هر رویداد را دقیقاً یکبار اثر میدهد؛ حتی اگر پردازش تکرار شود، نتیجه تغییر نمیکند. روی این پایه، ماژولهای منابع انسانی، حسابداری دوطرفه، انبار و تدارکات، CRM و باشگاه مشتریان، بایگانی و اتوماسیون اداری، و گزارشها و داشبورد ساخته شدهاند.
حفاظت از داده در یک ساختار چندشعبهای
هر شعبه فقط دادهٔ خودش را میبیند و این محدودیت در سطح خودِ پایگاه داده اعمال میشود، نه صرفاً در کد برنامه؛ یعنی حتی یک خطای برنامهنویسی هم نمیتواند مرز شعبهها را بشکند. کد ملی کارکنان بهصورت رمزنگاریشده نگهداری میشود و هر بار مشاهدهٔ آن، در یک دفتر رویدادِ فقطافزودنی ثبت میگردد.
مقیاس پروژه
- ساختار دادهٔ پایه با ۶۵ جدول بهعلاوهٔ ۱۳ مهاجرت تکمیلی
- ۲۰ ماژول دامنه در بکاند، حدود ۱۹ کنترلر و نزدیک به ۷۵ سرویس
- ۵ نقش کاربری با دسترسی مبتنی بر کدِ مجوز
- موتور فروش اتمی، حسابداری دفتری، جداسازی داده به تفکیک شعبه و پردازشگر پسزمینه
معماری فنی
پروژه یک مخزن دوبستهای است. بکاند با NestJS و TypeScript بهصورت یک تکپارچهٔ ماژولار روی PostgreSQL 16 نوشته شده و برای هر درخواست، محدودیت دسترسی سطح سطر را فعال میکند؛ اجرای مهاجرتها با یک نقش پرمجوز و اجرای برنامه با یک نقش محدودشده انجام میشود. الگوی «صندوق خروجی تراکنشی» نوشتن و پردازش را از هم جدا میکند و Redis نشستها، مدل خواندنی داشبورد و هماهنگی پردازشگر را بر عهده دارد. فرانتاند یک برنامهٔ تکصفحهای با React و Vite و MUI است. مبالغ بهصورت عدد صحیح ریالی نگهداری و فقط در لحظهٔ نمایش با قالب فارسی و تقویم جلالی قالببندی میشوند.
یادداشت صادقانه: ماژول حقوق و دستمزد با قواعد قانونیِ نمونه پیادهسازی شده و بهصراحت «موقت» علامتگذاری شده است؛ نهاییسازی آن نیازمند تطبیق با آخرین مقررات جاری است.
آنچه این پروژه دارد.
- فروش اتمی در صندوق: کسر موجودی، پورسانت، صندوق و سند حسابداری در یک تراکنش
- حسابداری دوطرفه با دفتر کل، اسناد، دورههای مالی و صورتهای مالی
- انبار و تدارکات با هشدار نقطهٔ سفارش، انتقال بین شعب و انبارگردانی
- منابع انسانی با قرارداد، حضور و غیاب، مرخصی و ورودی حقوق
- CRM شامل باشگاه مشتریان، کیف پول، کارت هدیه، معرفی و کوپن
- داشبورد مدیریتی بلادرنگ بر پایهٔ مدل خواندنی Redis
- جداسازی دادهٔ هر شعبه در سطح پایگاه داده
- رمزنگاری کد ملی بههمراه ثبت سابقهٔ هر بار مشاهده
- دفتر رویداد فقطافزودنی برای ردیابی کامل تغییرات