سامانه حسابداری ۲حساب
معرفی پروژه
۲حساب یک موتور حسابداری چندصنفی فارسی است که حسابداری دوطرفه (Double-Entry)، انبارداری لایهای با کاردکس کالا به روش FIFO، حوالههای انتقال بین انبارها و ماتریس تخصصی نمرات عدسی (SPH/CYL) را در یک سامانه یکپارچه جمع کرده است.
مسئله: کالایی که در نرمافزارهای آماده جا نمیشود
در صنف عینک، هر عدسی با دو عدد شناخته میشود: نمره کروی (SPH) و نمره استوانهای (CYL). یک مدل عدسی میتواند صدها ترکیب نمره داشته باشد. نرمافزارهای حسابداری آماده برای هر ترکیب یک کالای جدا میخواهند؛ نتیجه این میشود که فهرست کالا غیرقابلمدیریت میشود و موجودی واقعی دوباره به اکسل برمیگردد.
مشکل دوم بهای تمامشده بود. وقتی قیمت خرید هر بار عوض میشود، سود واقعی هر فروش فقط با نگهداری لایههای موجودی معلوم میشود، نه با یک میانگین تقریبی.
رویکرد: هسته ثابت حسابداری، پروفایل جدا برای هر صنف
۲حساب را دو لایه ساختم. هسته برای همه صنفها یکسان است: کدینگ حسابها، سند دوطرفه، اسناد خودکار و انبار لایهای. لایه صنفی فقط فیلد، واریانت و قیمتگذاری خودش را اضافه میکند و اجازه ندارد منطق سند را دور بزند. این قانون باعث میشود اضافه کردن یک صنف تازه، دفترها را خراب نکند.
برای عدسی، کالا یک ماتریس دوبعدی است: یک کالا، و موجودی و قیمت برای هر خانه از جدول نمرهها. خرید و فروش هم روی همین جدول ثبت میشود. روش مدلسازی این داده را در مقاله مدلسازی دادههای ماتریسی چندبعدی توضیح دادهام.
دقت مالی و کاردکس
هیچ مبلغی در این سامانه با عدد اعشاری معمولی (Float) حساب نمیشود؛ مبالغ در PostgreSQL از نوع NUMERIC هستند و محاسبه با decimal.js انجام میشود. هر سند پیش از ثبت بررسی میشود که جمع بدهکار و بستانکارش دقیقاً برابر باشد. چرایی این تصمیم را در این مقاله نوشتهام.
بهای تمامشده به روش FIFO محاسبه میشود: هر خرید یک لایه موجودی میسازد و هر فروش به ترتیب از قدیمیترین لایهها کم میکند. جزئیات پیادهسازی در کاردکس کالا و روش FIFO آمده است.
وضعیت امروز
سامانه روی 2hesab.smbz.ir در حال استفاده است و هنوز توسعهاش ادامه دارد. اگر کسبوکار شما هم کالایی دارد که در نرمافزارهای آماده درست تعریف نمیشود، صفحه طراحی نرمافزار حسابداری و انبارداری اختصاصی را ببینید.
ویژگیها و تصمیمهای فنی
- همه محاسبات پولی با decimal.js و نگهداری مبالغ بهصورت NUMERIC؛ بدون هیچ استفادهای از Float.
- اعتبارسنجی تراز هر سند پیش از ثبت؛ جمع بدهکار و بستانکار باید دقیقاً برابر باشد.
- ماتریس دوبعدی نمره کروی و استوانهای برای خرید، فروش و موجودی عدسی.
- ثبت نرخ ارز در لحظه معامله برای گزارشگیری درست چندارزی.
- ساختار مونوریپو با تایپهای مشترک بین API و کلاینت و تستهای خودکار روی دیتابیس ایزوله.
تکنولوژیها
- TypeScript
- Fastify
- PostgreSQL
- Drizzle ORM
- React
- Vite
- decimal.js
- pnpm workspaces
برای کسبوکار شما هم میسازم
اگر سامانهای شبیه این لازم دارید، جزئیات خدمت و فرم درخواست مشاوره اینجاست: