چکیده
هر برنامه ای قبل از نوشته شدن نیاز به طراحی و مهندسی دارد، هیچ برنامه نویسی نمیتواند بدون طراحی برنامه شروع به نوشتن آن بکند
طراحی برنامه میتواند ذهنی باشد ، و میتواند برای تسلط بیشتر بر روی ورق یا برنامه های مربوطه طراحی شود
طراحی گرافیکی برنامه نیز میتواند از طریق طراح با نظارت مدیر پروژه طراحی شود.
در طراحی نرم افزار، اولین مرحله مشخص کردن نیاز مشتری و نحوه برطرف کردن نیاز مشتری است.
نرم افزار های مالی و اداری اصولا برای حل و راحت تر کردن مسائل مالی تشکیل میشوند
سامانه مدیریت مالی تره بار فروشی راه حلی برای مشکل های مالی یک تره بار فروشی سنتی است.
در مراحل اولیه بایستی مشکلات مدیریت یک فروشگاه میوه سنتی بررسی شود ، به همین دلیل برای چند هفته در کنار برادرم که یک میوه فروشی را اداره میکند بودم و او اشکالات و خلاء های مدیریت مالی را با من به اشتراک گذاشت.
همانطور که در بالا اشاره شد ، هدف از ساخت نرم افزار های حسابداری و نرم افزار های عمومی راحت تر کردن و اتوماسیون در کار ها میباشد ، که هم ضریب خطا را کاهش دهد و هم کاربر به رفاهی بیشتر برسد .
خیلی مواقع در حسابداری دستی و سنتی فاکتور ها گم میشوند و دسترسی به فاکتور های قدیمی امکان پذیر نمیباشد اما با ساخت نرم افزار از خطا های انسانی در حسابداری دور میشویم.
و همچنین در بعضی مواقع پیگیری یک فاکتور قدیمی ، پیگیری بدهکاری یا بستانکاری بصورت دستی مساله را پیچیده میکند.
- در طراحی برنامه داده های اولیه یا پی ریزی برنامه چگونه وارد نرم افزار میشوند؟
- برای ایجاد فاکتور بایستی از چه روشی استفاده کنیم؟
- وقتی یک فروشگاه بزرگ داشته باشیم چگونه همزمان چندین کاربر به این سیستم دسترسی داشته باشند؟
- در هنگام ایجاد فاکتور مبلغی پرداخت نمیشود ، چگونه این مساله مالی قابل حل است؟
- یکسری از کاربران نمیبایست به قسمت های حساس برنامه دسترسی داشته باشند ، این مورد چگونه قابل حل است؟
- تاریخ فارسی در SQLقبل از ویندوز 10 پشتیبانی نمیشود برای این مساله چه راه حلی پیش روست؟
جواب همه ی این سوالات در فصل های بعدی پاسخ داده خواهد شد .
همانطور که پیش از این اشاره شد برای اطلاع کامل از سیستم میوه فروشی ، ابتدا باید سیستم سنتی آن را بطور کامل دانست که بر روی آن سیستمی جدید ایجاد کرد که ایراد های روش قبلی را برطرف کند
به همین علت علاوه بر مغازه های میوه فروشی ، از حجره های میدان بار هم دیدن کردم که آن طرف قضیه (خرید میوه) هم برایمان روشن گردد.
نکته مهم آن است که خرید های انجام شده در میدان بار ، در همان روز پرداخت نمیشوند و بصورت قسط گونه میباشند. پس به همین روال برنامه ما بعد از ایجاد فاکتور بایستی بصورت اتوماتیک یک قسط برای همان فاکتور نیز ایجاد کند .
- باید نیاز های مشتری بررسی شوند و چارت نیاز ها بر روی کاغذ یا ... یاد داشت شوند
- سیستم سنتی بصورت کامل توسط مشتری تشریح شود
- ایرادات سیستم قدیمی یافته شوند و سعی شوند برای آنها راه حلی پیدا شوند
- بایستی سوال ها درباره برنامه مطرح شوند ، هر مساله ای یک سوال است که بایستی جوابی برای آن پیدا کنیم
- بررسی ایده ها و راه های رسیدن به جواب
- بعد از بررسی راه حل های پیشنهادی برای سیستم جدید ، آنها را با مشتری در میان میگذاریم
- بعد از کامل شدن و مشخص شدن راه ها و رویکرد ها شروع به تحلیل نرم افزار (روش نوشتن یک برنامه میکنیم) .
· نکته مهم : 70 در صد برنامه نویسی بخش تحلیل نرم افزار است ، بنابراین اگر تحلیل دقیق و درستی نداشته باشیم در قسمت ها بعدی به مشکلات بزرگی بر میخوریم.
- بعد از تحلیل نحوه ایجاد برنامه و هدف از سیستم جدید ، بایستی جدول ها و پیش نمایش جدول ها ایجاد شوند
- رابطه استاندارد بین جدول ها برقرار شود
- پیش نمایش پوسته برنامه طراحی شود (wireframe)
- حال میتوانید کامپیوتر خود را برای شروع نوشتن برنامه مورد نظر روشن کنید ، اما عجله نکنید ، هنوز ممکن است تحلیل های اضافی انجام شود و یا نیاز باشد به مراحل قبل سرک بکشید
- از ابزار مورد نظر خودتان برای نوشتن برنامه استفاده کنید ، اما نباید خودتان را با ابزار محدود کنید ، انتخاب زبان های مختلف برای یک برنامه نویس محدودیت نیست ( یک برنامه نویس میتواند هر زبانی که بخواهد را شروع کند ، مهم منطق برنامه نویسی است)
همان طور که میدانید وظیفه میوه فروش رساندن میوه از کشاورز / میدان بار ، به مشتری است
یک میوه فروش بایستی میوه های خود را از یکی ازین دو روش تامین کند که اکثرا از میدان بار است
پس اولین جدولی که به آن نیاز داریم جدول فروشنده ها است.
در شکل زیر جزییات جدول فروشنده را مشاهده میکنید.
اولین فیلد : فیلد کلید است که بصورت اتوماتیک عدد رکورد بعدی را ایجاد میکند ، وجه تمایز رکورد ها با رکورد های دیگر است.
همه ی جدول ها بایستی فیلدی بعنوان کلید داشته باشند.
دومین فیلد : نام است که نام فروشنده در آن ذخیره میشود
سومین فیلد : در صورت خرید از حجره ، شماره حجره در این فیلد ذخیره میشود
چهارمین فیلد : شماره تلفن یا شماره همراه فروشنده در آن ذخیره میشود.
اولین فیلد : کلید این جدول است
دومین فیلد : نام میوه را ذخیره میکند
سومین فیلد : فیلدی اختیاری است و میتوان اندازه میوه را در آن ذخیره کرد
فیلد اول : فیلد کلید میباشد
فیلد دوم : نام کالا برای نمایش در دیتاگرید در این مکان هم ذخیره میشود
فیلد سوم : تعداد یک سفارش در آن ذخیره میشود
فیلد چهارم : قیمت کالای خریداری شده در آن ذخیره میشود
فیلد پنجم : وزن کالای خریداری شده در آن ذخیره میشود
فلید ششم : فیلدی برای محاسبات داخلی نرم افزار است
فیلد هفتم : کاربر میتواند شماره دستی فاکتور خودش را نیز وارد کند
فیلد هشتم : کلید خارجی برای اتصال بین جدول میوه و این جدول است
اتصال بین عضو فاکتور و لیست میوه
برای اینکه در عضو فاکتور مان یک نوع از میوه در لیست میوه داشته باشیم بایستی این دو جدول به هم متصل شوند .
· نکته : برای اینکه هر فاکتور را بتوان از فاکتور های دیگر مجزا کرد باید یک جدول به نام فاکتور اصلی ایجاد کرد که زیر فاکتور را در نهایت به آن متصل کنیم.
اولین فیلد : کلید این جدول است .
دومین فیلد : شماره دستی فاکتور میباشد .
سومین فیلد : تاریخ فاکتور در این فیلد ذخیره میشود
چهارمین فیلد : مبلغ کل اغلام زیر فاکتور به این فیلد انتقال مییابند
پنجمین فیلد : نام فروشنده در این فیلد بصورت متن ذخیره میشود که در زمان نمایش در دیتاگرید کارمان راحت شود.
ششمین فیلد : آی دی تاریخ میباشد که در فاصل پنجم بصورت مفصل توضیح داده خواهد شد.
هفتمین فیلد : کلید خارجی برای اتصال به جدول فروشنده است ، هر فروشنده برابر یک رکورد در جدول فروشنده است.
اتصال بین جدول فاکتور اصلی و زیر فاکتور
برای اینکه هر فاکتور بتواند اجزایی داشته باشد ، نیاز به دو جدول است که فاکتور اصلی نشانگر یک فاکتور است و زیر فاکتور نشانگر اغلام موجود در آن فاکتور است
· نکته : هر فاکتور میتواند چندین زیر فاکتور داشته باشد ، اما هر زیر فاکتور فقط میتواند یک فاکتور اصلی داشته باشد.
اتصال بین جدول فروشنده و فاکتور اصلی
برای اینکه هر فاکتور فقط به یک فروشنده اختصاص پیدا کند نیاز داریم جدول فروشنده را که حاوی فروشنده هایمان است به جدول فاکتور متصل کنیم
· نکته : هر فروشنده میتواند چندین بار در جدول فاکتور تکرار شود اما هر فاکتور فقط میتواند به یک فروشنده اختصاص پیدا کند.
هر فاکتوری که ایجاد شده قطعا یک تراکنش مالی ای هم همان لحظه انجام میشود که در ادامه توضیح خواهیم داد
فیلد اول : کد کلید این جدول است
فیلد دوم : کل مبلغ آن فاکتور است
فیلد سوم : پرداختی های انجام شده در این فیلد ذخیره میشود
فیلد چهارم : مانده حساب در این فیلد ذخیره میشود
فیلد پنجم : تاریخ ایجاد این تراکنش یا هر تراکنش پرداختی جداگانه در این فیلد ذخیره میشود
فیلد ششم : کلید خارجی به جدول فاکتور میباشد
اتصال جدول تراکنش مالی به جدول فاکتور
برای اینکه برای هر فاکتور اصلی یک تراکنش ایجاد شود بایستی این دو جدول به هم متصل شوند.
فیلد اول : کلید این جدول است
فیلد دوم : تاریخ ایجاد فروش است
فیلد سوم : مبلغ فروش شیفت مورد نظر است
فیلد چهارم : کلید خارجی شیفت مورد نظر ( در ادامه به ان میرسیم)
فیلد پنجم : کلید تاریخ است ( در فصل های بعدی توضیح داده خواهد شد)
این جدول برای جدا سازی شیفت های فروش ایجاد شده است (صبح ، ظهر ، عصر).
فیلد اول : کلید است
فیلد دوم : زمان آن شیفت
اتصال بین جدول فروش روز و شیفت ها :
هر فروش روز شامل یک شیفت میباشد پس بایستی بین این دو جدول رابطه برقرار شود.
این جدول برای حساب تاریخ شمسی ایجاد شده است ، در فصل های بعدی توضیح داده خواهد شد .
اولین فیلد : کلید است
دومین فیلد : تاریخ تبدیلی میباشد
جدول 9 : ورود و خروج : این جدول برای ورود و خروج کاربران تعبیه شده است.
فیلد اول : کلید این جدول است.
فیلد دوم : نام کاربری کاربر مورد نظر در این فیلد ذخیره میشود
فیلد سوم : پسورد کاربر در این فیلد ذخیره میشود
فیلد چهارم : نوع کاربر در این فیلد ذخیره میشود (ادمین / کاربر عادی)
نتیجه گیری این فصل : در این فصل کلیه جدول ها و فیلد ها توضیح داده شد در فصل بعدی میخواهیم از لحاظ منطقی برنامه را بصورت کامل بررسی کنیم.
بررسی ریز به ریز برنامه
همانطور که پیش از این گفتیم در یک میوه فروشی میوه ها بایستی از میدان بار یا کشاورز تهیه شوند
در میدان بار میوه خریداری میشود و هر فروشنده یک فاکتور به ما میدهد ، از لحاظ مالی ممکن است مبلغ فاکتور همان لحظه پرداخت نشود ، پس به همین دلیل برنامه مان نیاز به بخش قسط بندی دارد ، جدول تراکنش مالی به همین منظور تعبیه شده است.
ایجاد فاکتور
پیش از اینکه میوه خریداری شود قطعا برای آن محصول فاکتور صادر میگردد
از انجایی که یک فاکتور نیاز به زیر مجموعه دارد ، پس برای ایجاد یک فاکتور در برنامه مان به دو جدول نیاز داریم که پیش از این گفتیم (فاکتور اصلی ، زیر فاکتور)
فاکتور اصلی را میتوان به کاغذی که شامل فاکتور است و زیر فاکتور را به اجزای ثبت شده در آن فاکتور تشبیه کرد .
برای ایجاد فاکتور ابتدا بایستی فاکتور اصلی آن ایجاد شود و سپس زیر فاکتور به آن اضافه گردد ، اگر زیر فاکتوری به فاکتور مان اضافه نشود فاکتور مورد نظر بصورت اتوماتیک ثبت نمیشود و همچنین تراکنش مالی ای برای آن فاکتور ایجاد نمیشود.
تبدیل تاریخ و بحث شمسی سازی تاریخ
در SQLهای قدیمی تر و در ویندوز های قبل از ویندوز 10 ، تاریخ شمسی بصورت پیشفرض توسط سیستم تشخیص داده نمیشد .
ما در این برنامه رویکردی را پیش گرفتیم که برای همیشه میتواند بر روی همه ی سیستم ها اجرا شود .
چونکه تبدیل تاریخ میلادی به شمسی مشکل است و در نهایت برای جستجو در بین تاریخ ها به مشکل بر میخوریم سیستمی برای کد گذاری تاریخ ایجاد کردیم
که برای تاریخ شمسی یک کد شناسه در تقویم میلادی ایجاد میکند ، به همین علت دیگر در بحث تاریخ و در بخش جستجو در بین تاریخ ها مشکلی نخواهیم داشت.
بخش فروش روز
در هر شیفت کاری مقدار فروشی که انجام میشود ثبت میشود که در نهایت در بخش گزارش گیری بتوان مقدار فروش های صبح یا ظهر یا عصر را با هم مقایسه نمود .
· نکته : پایه ی عملیات مقایسه ی تاریخ در این برنامه از طریق فانشن و جدول اختصاصی ای که نوشته شده انجام میشود .
بخش کاربران
یکی از بخش های مهم برنامه که سطح دسترسی را مشخص میکند .
کاربر های ادمین به بخش های اصلی برنامه مانند گزارش گیری ماهانه و مدیریت کاربران دسترسی دارند ، اما کاربران عادی بدالی امنیتی از بخش های مدیریتی محرومند .
نکته مهم در مورد این برنامه این است که در ابتدای نصب برنامه مسلما هیچ جدولی بر روی سیستم کاربر وجود ندارد ، این برنامه در ابتدای اجرا در صورتی که کاربر پیشفرض وجود نداشته باشد آنرا ایجاد میکند.
شبکه سازی برنامه
این برنامه دارای قابلیت شبکه سازی میباشد و چندین کاربر از روی چند سیستم مجزا میتوانند به نرم افزار دسترسی داشته باشند .
در فصل ششم نحوه پیاده سازی این قابلیت را کامل توضیح خواهیم داد.
همچنین به این نکته توجه داشته باشید که میتوانید برنامه تان را تحت اینترنت نیز به اشتراک بگذارید ، پیشنیاز چنین قابلیتی ip اختصاصی میباشد که بایستی از سرویس دهنده اینترنت درخواست و دریافت شود.
در این فصل میخواهیم بخش های مختلف برنامه را به تصویر بکشیم و کمی از کد های بخش های حساس بگوییم.
در گام اول با بخش ورود کاربران مواجه میشوید
در زیر کلید ورود کد ها به شکل زیر میباشند
ابتدا یوزرنیم و پسورد را از ورودی میگیرد و سپس در دیتابیس برای آن جستجو میکند ، اگر جوابی وجود داشت طبق نوع کاربر فرم اصلی برنامه باز خواهد شد در غیر این صورت کاربر با خطا مواجه خواهد شد.
فرم اصلی برنامه به شکل زیر است ، تمام امکانات در دسترس کاربر قرار دارند ، از لحاظ UI(ظاهر برنامه) و UX(تجربه کاربری) تایید شده میباشد.
همچنین در نوشتار برنامه از فونت "یکان" استفاده شده است.
در این بخش میتوانیم میوه هایمان را اضافه کنیم ، این یکی از ریشه های اصلی برنامه است به این معنا که ساختار اصلی برنامه مان را شکل میدهد (داده های اصلی برنامه که کاربر وظیفه وارد کردن آنها را دارد).
در زیر دکمه های این فرم کدی است که ما را به فرم مربوطه برای حذف جدید یا ویرایش میبرد
بعد از کلیک کردن بر روی جدید به فرم دیگری ارجاع داده میشویم
در این قسمت بعد از کلیک کردن بر روی ثبت کد های زیر اجرا خواهند شد
اگر ما کلید ویرایش را زده بودیم اطلاعات بر روی فرم دوباره پیاده سازی میشوند و قابل ویرایش هستند
و اگر هم کلید ثبت را بزنیم یک فرمی خالی نمایش داده میشود که میتوانیم داده خود را در آن وارد کنیم.
بخش افزودن فروشنده نیز که از قبل جدول این بخش را توضیح داده ایم ، یکی از بخش های ورود داده های اولیه برنامه است. و روند کار آن همانند افزودن میوه میباشد
یکی از بخش های اصلی برنامه ایجاد فاکتور است که با کلید های ثبت ، ویرایش و حذف مجهز شده است.
در هنگام کلیک بر روی دکمه ی ثبت به فرمی جدید ارجاع داده میشوید
و اگر قصد ویرایش داشته باشید اطلاعات فیلد مورد نظر نیز به فرم جدید ارسال میشود.
برای ایجاد یک فاکتور ابتدا بایستی فاکتور اصلی برای آن ایجاد کنیم و شماره فاکتور که معمولا در بالای فاکتور مینویسند در شناسه دستی وارد کنیم (نمیتواند تکراری باشد)
نام فروشنده هم که از قبل وارد کرده ایم در بخش فروشنده پدیدار خواهد شد ، بعد از انتخاب تاریخ بر روی فاکتور جدید کلیک میکنیم
همانطور که از پیش گفتیم در صورتی که تا همینجا به عقب بازگردیم بصورت اتوماتیک هیچ فاکتوری ثبت نخواهد شد
بعد از ایجاد فاکتور میتوانیم به فاکتور مان زیر فاکتور اضافه کنیم
و در صورت کلیک بر روی ثبت به صورت زیر اطلاعات ثبت خواهد شد
بعد از بستن صفحه ی فاکتور ، همانطور که مشاهده میکنید فاکتور ایجاد شده است.
در همین لحظه در پس زمینه یک قسط برای این فاکتور ایجاد میشود ، چونکه همانطور که در ابتدا بررسی کردیم تمام مبلغ در همان ابتدا پرداخت نمیشود
در شکل پایین، نمایی از بخش فروش را مشاهده میکنید که شیفت های فروش هم در آن مشخص هستند.
کاربر در این بخش میتواند فروش های روزانه خود را ثبت نماید.
این بخش تراکنش های مالی میباشد
تاریخ را بصورت کد گذاری شده تشخیص میدهد و حتی میتوان خرید ها را بر اساس فروشنده نیز فیلتر نمود.
یکی از بخش های مهم آن است که تمام مبالغ را از تاریخ های مشخص شده در پایین فرم جمع میکند.
قبل از شروع گزارش گیری برنامه ابتدا تاریخ شروع و تاریخ پایان را دریافت میکند
تکه کد زیر در صورتی که تیک فروشنده مخصوص را زده باشیم عمل میکند
و تکه کد زیر در صورتی که بصورت عادی فقط از تاریخی به تاریخی دیگر جستجو کنیم عمل میکند ( بدون یک مشتری خاص)
و خط اخر نیز کل فیلد هایی که مورد نظرمان بود را با هم جمع میکند
برای بخش فروش روز نیز میتوان گزارش گیری نمود، و هر شیفت را بصورت جداگانه فیلتر نمود.
عمل گزارش گیری برای فروش روز نیز دقیقا همانند خرید روز میباشد
در بخش خرید و فروش روز چاپ فاکتور نیز اضافه کردیم
از انجایی که عمل چاپ بصورت دستی عملی بسیار پیچیده میباشد از افزونه ی DGV Printerاستفاده کردیم به شکل زیر چنین خروجی ای به ما خواهد داد .
در کد های زیر در بخش اول افزونه ی مورد نظر را ارجاع میدهد و نوعی جدید از آن میسازد ، سپس هدر و فوتر آنرا تشکیل میدهد
بخش زیر مربوط به قسط بندی است (بصورت اتوماتیک بعد از ایجاد فاکتور ایجاد میشود) میتوان هر فاکتور را قسط بندی نمود.
در بخش مدیریت کاربران نیز میتوان کاربر های جدید اضافه نمود و کاربر های قبلی را ویرایش کرد.
حال پس از توضیح کامل در مورد ویژگی های برنامه میخواهیم سفری به زیر پوسته ی برنامه مان بکنیم
نکته ای مهم: همیشه در برنامه نویسی یکی از اهداف یک برنامه نویس آن است که از دوباره نویسی جلوگیری شود ، به همین علت اکستنشن ها قابل توسعه هستند ، ما میتوانیم برای برنامه مان اکستنشن بنویسیم که در هر جایی از برنامه چندین بار از آن تکه کد استفاده کنیم و همچنین کد هایمان مرتب و تمیز تر جلوه دهند.
حال چندین اکستنشن نوشته شده در برنامه را بررسی میکنیم
همانطور که مشاهده میکنید وظیفه ی تکه کد بالا تبدیل کد میلادی به شمسی است ، خروجی این تابع یک متن که خروجی تاریخ شمسی شده را برمیگرداند
و بخش refrencesنمایانگر آن است که این تکه کد در 3 جای این برنامه استفاده شده است.
همانطور که پیش از این گفتیم ، خروجی تبدیل به شمسی بصورت متن میباشد ، ما در بخش گزارش گیری و قسمت های دیگر برای Query گرفتن از تاریخ های موجود به مشکل بر میخوریم ، برای مثال اگر بخواهیم تاریخ های بین 1/2/1397 تا 1/10/1397 را بدست آوریم یا چیزی را بین این تاریخ ها محاسبه کنیم با یک تاریخ شمسی شده و بصورت متن کاری نمیتوانیم بکنیم ( بین آن دو تاریخ را نمیتوانیم پیدا کنیم)
در بخش گزارش گیری و در بخش های دیگر نرم افزار از این اکستنشن استفاده شده است.
پس جدولی جداگانه ایجاد کردیم که در هر روزی که چیزی خواست ثبت شود شناسه ی آن تاریخ را برگرداند ، اگر هم تا به امروز برای آن روز شناسه ای ثبت نشده بود یک شناسه برای آن روز میسازد
همانطور که در بخش رفرنس ها مشاهده میکنید از این تکه کد 9 بار در برنامه استفاده شده.
در این مقاله سعی شد به از تمامی زوایا به برنامه پرداخته شود و از تمام تکنولوژی ها و ویژگی های برنامه رونمایی شود
تا جایی که توانستم بر روی ظاهر کاربری این برنامه کار کرده ام و در آینده نسخه های بعدی این برنامه نیز نوشته خواهد شد.
همچنین از آنجایی که این برنامه قابلیت شبکه را نیز داراست پس میتوان نرم افزار مالی خود را هم از طریق اینترنت و هم از طریق شبکه داخلی ویرایش و مدیریت نمود ، ازین رو دسترسی به اطلاعات فوق العاده اسان تر و ساده تر شده است.
منابع
تاریخ ساخت : زمستان 1397
لینک دانلود و فعال سازی برنامه:
https://github.com/mamadmti/Fruitshop-accounting-sofware.git