<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های سیروان شریعت پناه</title>
        <link>https://virgool.io/feed/@xeedio</link>
        <description>برنامه نویس سی شارپ هستم، از سال 94 بصورت حرفه ای کار برنامه نویسی رو شروع کردم، الانم بصورت فریلنسری کار میکنم، پذیرای پروژه های شما هستم</description>
        <language>fa</language>
        <pubDate>2026-04-15 02:50:25</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/8299/avatar/uQSu2Q.jpeg?height=120&amp;width=120</url>
            <title>سیروان شریعت پناه</title>
            <link>https://virgool.io/@xeedio</link>
        </image>

                    <item>
                <title>ارسال پارامتر از سی شارپ به مایکروسافت Word</title>
                <link>https://virgool.io/@xeedio/%D8%A7%D8%B1%D8%B3%D8%A7%D9%84-%D9%BE%D8%A7%D8%B1%D8%A7%D9%85%D8%AA%D8%B1-%D8%A7%D8%B2-%D8%B3%DB%8C-%D8%B4%D8%A7%D8%B1%D9%BE-%D8%A8%D9%87-%D9%85%D8%A7%DB%8C%DA%A9%D8%B1%D9%88%D8%B3%D8%A7%D9%81%D8%AA-%D9%88%D8%B1%D8%AF-ajn67xvstpbo</link>
                <description>خب، توی این مقاله میخوایم نحوه ارسال پارامتر از برنامه ای که با سی شارپ نوشته شده به نرم افزار Word رو آموزش بدیم.سناریو رو اول بررسی میکنیم:فرض کنید نامه ای رو می خوایم تنظیم کنیم، سمت برنامه شماره و تاریخ و نام مدیر عامل و... را مشخص می کنیم و می خوایم این اطلاعات رو بفرستیم به ورد و همچنین متن نامه رو هم در ورد تایپ کنیم و در آخر هم نامه رو  آرشیو کنیم.برای اینکار چندین روش وجود داره ما توی این مقاله از روش MailMergeField و Bookmark استفاده میکنیم، خب بریم سراغ آموزش:ابتدا ما میخوایم یک الگو یا Template درست کنیم و بعد ها از روی اون  نامه جدیدی رو ایجاد کنیم و فیلد هارو براش پر کنیم، برای اینکار یک سند  جدید در Word ایجاد میکنیم و به سربرگ Mailings مراجعه میکنیم، دکمه Select  Recipients رو بزنین از منوی باز شده Type a NewList رو بزنین با اینکار  پنجره ای باز میشه دکمه Customize Columns رو بزنین این پنجره شامل فیلدهایی میشه که میتونین ازش استفاده کنین و روی سند قرار بدین و داخل برنامه با پیدا کردن این فیلد میتونین به جاش مقدار مورد نظرتون رو بهش پاس بدین، حالا شما نیاز دارین که از طرق دکمه Add تمامی فیلد هایی که یک نامه شامل  میشه و به نظرتون میاد که باید لحاظ کنین رو بسازین، پس از این کار در هر دو پنجره دکمه OK رو بزنین بدین صورت یک پنجره ذخیره براتون باز میشه این  فیلدهایی که ایجاد کردین به عنوان یک دیتابیس کوچیک ذخیره میشه، که تمامی  فیلد هارو دارا میباشه و هرموقع خواستین دوباره میتونین از همین فیلد ها  استفاده کنین، حالا میرسیم به قرار دادن این فیلد ها داخل سند، با ذخیره کردن فیلدها،  تمامی گزینه های سربرگ Mailings فعال میشن، شما برای اینکه فیلدی رو بذارین رو سند، روی Insert Merge Field کلیک و متناسب با نیازتون فیلد هارو قرار بدین و الگو رو طراحی کنین من یک نمونه میذارم:نمونه الگوی طراحی شدهحالا فایل رو با پسوند .DOT ذخیره کنین، حالا این فایل رو در دیتابیس ذخیره کنین، به این روش ذخیره کنین:String FilePath = &amp;quotTemplate Path&amp;quot
// Converting File to ByteArray
byte[] FileBuffer = System.IO.File.ReadAllBytes(FilePath);
// Now you can insert this file buffer to DBالان ما الگومون آماده ست و میتونیم از طریق برنامه به این الگو دسترسی داشته باشیم و بهش پارامتر هاشو ارسال کنیمحالا فرضا شما یه فرم داری که از کاربر اطلاعات رو دریافت میکنه و میخوای  همین اطلاعات رو به Word ارسال کنی، (اول تئوریشو میگم) برای اینکار ابتدا  باید یه نمونه از الگویی که طراحی کردیم رو داخل سیستم ذخیره کنیم، یعنی  باید از دیتابیس فراخوانی کنیم و اون آرایه بایتی رو، روو سیستم تبدیل به  فایل کنیم، سپس از سمت برنامه تمامی فیلدهای موجود در این الگو رو بخونیم و  به جای تک تکشون مقدار مناسب رو قرار بدیم، در نهایت این فایل رو توسط  کدنویسی روی سیستم کاربر ذخیره میکنیم، فایل رو تبدیل به آرایه بایتی  میکنیم، داخل دیتابیس درج میکنیم و فایل رو از سیستم کاربر حذف میکنیم ابتدا Assembly مربوط به MicroSoft.Office.Interop.Word رو به رفرنس هامون اضافه میکنیم و سربرگش رو هم Using میکنیم، حالا میرسیم به کد نویسی:کدای زیر رو به صورت سراسری داخل فرم تعریف میکنیم//LOCATION OF THE TEMPLATE FILE ON THE MACHINE;
Object oTemplatePath = string.Format(&amp;quot{0}\\NewDocument.dot&amp;quot, Application.StartupPath);
 
//OBJECT OF MISSING &amp;quotNULL VALUE&amp;quot
Object oMissing = System.Reflection.Missing.Value;
 
//OBJECTS OF FALSE AND TRUE
Object oTrue = true;
Object oFalse = false;
 
//CREATING OBJECTS OF WORD AND DOCUMENT
Microsoft.Office.Interop.Word.Application oWord = null;
Microsoft.Office.Interop.Word.Document oWordDoc = null;کدای زیر رو داخل ایونت کلیک دکمه مثلا &quot;پیشنمایش&quot; مینویسیم:// Fetching Template ByteArray From Database =&gt; Byte[] YourTemplateByteArray = Fetch Template;
 
System.IO.File.WriteAllBytes(oTemplatePath.ToString(), YourByteArray);
 
oWord = new Microsoft.Office.Interop.Word.Application();
oWordDoc = new Microsoft.Office.Interop.Word.Document();
 
//Adding A New Document From A Template
oWordDoc = oWord.Documents.Add(ref oTemplatePath, ref oMissing, ref oMissing, ref oMissing);
 
 
int iTotalFields = 0;
// Finding Mailmerge Fields
foreach (Microsoft.Office.Interop.Word.Field myMergeField in oWordDoc.Fields)
{
	iTotalFields++;
	Microsoft.Office.Interop.Word.Range rngFieldCode = myMergeField.Code;
	String fieldText = rngFieldCode.Text;
 
	// Only Get The Mailmerge Fields
	if (fieldText.StartsWith(&amp;quot MERGEFIELD&amp;quot))
	{
		// Gives The Fieldnames as Entered in .DOT File
		string fieldName = fieldText.Substring(12, fieldText.IndexOf(&amp;quot &amp;quot, 12) - 12);
 
		switch (fieldName)
		{
			case &amp;quotLetter_No&amp;quot :
				myMergeField.Select();
				oWord.Selection.TypeText(txtLetterNo.Text);
				break;
 
			case &amp;quotLetter_Date&amp;quot :
				myMergeField.Select();
				oWord.Selection.TypeText(DateTime.Now);
				break;
 
			case &amp;quotLetter_Has_Attachment&amp;quot :
				myMergeField.Select();
				oWord.Selection.TypeText(&amp;quotدارد یا ندارد&amp;quot);
				break;
                 
			// And So On
			default:
				break;
		}
	}
}
 
//Showing The Document To The User
oWord.Visible = true;حالا یه دکمه میذاریم برای ذخیره فایل ورد، زمانی که کاربر تایپ کردنش تموم شد و هنوز برنامه ورد در حال اجراس این دکمه رو اجرا میکنه، دقت کنید برنامه ورد نباید بسته بشه، باید باز باشه بعد دکمه ذخیره رو بزنیم.با کدنویسی، برنامه Word رو خودمون میبندیم، نیازی به دخالت کاربر نیست.oWordDoc.Save();

//Closing the file
oWordDoc.Close(ref oFalse, ref oMissing, ref oMissing);

//Quitting the application
oWord.Quit(ref oMissing, ref oMissing, ref oMissing);
byte[] FileBuffer = System.IO.File.ReadAllBytes(oTemplatePath.ToString  ());
 
// Now Insert The FileBuffer Into Database as A Letterخب کار تمومه، حالا فیلد FileBuffer رو دیگه بسته به کدنویسی خودتون باید داخل دیتابیس ذخیره کنید که برای بعدها بتونید واکشیش کنید و به کاربر نمایشش بدین.اینم نمونه جایگذاری فیلدها:نمونه جایگذاری فیلدهااین آموزش رو خیلی سال پیش توی این تاپیک داخل فوروم برنامه نویس نوشته بودم.</description>
                <category>سیروان شریعت پناه</category>
                <author>سیروان شریعت پناه</author>
                <pubDate>Mon, 03 Apr 2023 12:25:06 +0330</pubDate>
            </item>
                    <item>
                <title>استفاده از کاستوم ایونت برای عملیات جستجو در سی شارپ</title>
                <link>https://virgool.io/@xeedio/%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%DA%A9%D8%A7%D8%B3%D8%AA%D9%88%D9%85-%D8%A7%DB%8C%D9%88%D9%86%D8%AA-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%B9%D9%85%D9%84%DB%8C%D8%A7%D8%AA-%D8%AC%D8%B3%D8%AA%D8%AC%D9%88-ech9jixnyuoh</link>
                <description>سلام توی این آموزش میخوام درمورد استفاده از Custom Events در سی شارپ صحبت کنم، اینکه چطور میتونیم داخل برنامه هامون با یه روش حرفه ای اطلاعات موردنظرمون رو به فرم های دنبال کننده پاس بدیممساله رو اینجوری در نظر بگیریم:فرض کنید یک فرم جستجو داریم که توش یک دیتاگرید هست میخوایم وقتی کاربر از فرم دیگه ای به این فرم مراجعه کنه و روی یکی از سطرها کلیک کنه، اطلاعات این سطر از  دیتاگرید به فرم قبلی بازگشت داده بشه.حالا آیا راهی داره که کاربر از هر فرمی که وارد این فرم جستجو میشه، اطلاعات دیتاگرید به همون فرم برگرده؟برای اینکار یه روش خیلی مبتدیانه اینه که یه پراپرتی استاتیک در سطح برنامه تعریف کنیم که هروقت نیاز به اطلاعات بازگشتی از فرم جستجو بود، اطلاعات موردنیاز رو داخل این پراپرتی استاتیک قرار بدیم و داخل فرم موردنظر ازش استفاده کنیم و مابقی ماجرا (بنده اصلا این روش رو پیشنهاد نمیکنم، چون روش خیلی چیپیه)راه حرفه ایش استفاده از Custom Events هستش، یعنی شما یه ایونت مینویسین که هر موقع روی سطر موردنظر روی دیتاگریدویو کلیک شد، فرم جستجو  بسته بشه و اطلاعات موردنیاز در قالب یک Custom EventArgs به فرم دنبال کننده (همون فرمی که میخواین اطلاعات بهش بازگشت داده بشه) پاس داده بشه به فرم یا کلاسی که ایونت رو داخلش تعریف میکنیم اصطلاحا میگیم Publisher یا انتشار دهنده و به فرم و یا کلاسی که میخوایم اطلاعات بازگشتی از ایونت  رو دریافت کنیم اصطلاحا میگیم Subscriber یا دنبال کنندهبرای انجام اینکار توسط ایونت باید سه مرحله انجام بدیم:1. تعریف Delegate2. تعریف ایونت بر اساس اون دلیگیت3. فراخوانی ایونت خب برای مرحله اول لازمه که توی فرم جستجو (کلاس پابلیشر یا انتشاردهنده) داخل کلاس، یه delegate با signature زیر تعریف کنیم:public delegate void SearchEventHandler(object sender, EventArgs args);پس ایونتی که استفاده میکنیم باید از این signature تبعیت کنه، یعنی ریترن  تایپش void باشه، دوتا پارامتر بگیره، اولی از جنس ابجکت و مشخص کننده  کلاسیه که این ایونت رو ازش فراخونی میکنیم، دومین پارامتر از جنس کلاس  EventArgs که شامل دیتا و اطلاعاتی میشه که لازم داریم (شما باید یه کلاس  کاستوم برای eventargs بنویسین که اون اطلاعاتی که لازم دارین رو در خودش  داشته باشه، در ادامه این رو هم توضیح میدم) حالا میایم داخل بدنه کلاس فرم جستجو یه نمونه ایونت از این دلیگیت میسازیم، بشکل زیر:public event SearchEventHandler ItemSelected;مرحله دوم هم تموم شد. حالا میرسیم به مرحله سوم، برای فراخوانی ایونت، باید یه متد تعریف کنیم که  مسئول فراخوانی ایونت هستش، پس یه متد با signature زیر تعریف میکنیم:protected virtual void OnItemSelected(EventArgs args)
{
	if(ItemSelected != null)
	{
		ItemSelected(this, args);
	}
}توضیح متد بالا اینه که اگر اون ایونتی که تعریف کردیم دنبال کننده ای  داشته باشه (یعنی توی کلاس یا فرم دیگه ای این ایونت رو فراخوانی کرده  باشیم یا اصطلاحا ایونتمون فایر(fire) شده باشه) مخالف null میشه و داخل  بدنه if اون رو دقیقا مثل یک متد معمولی فراخوانی میکنیم تا دنبال کننده ها  رو از این ایونت باخبر کنیم، اما باید از اون signature که برای دلیگیت  تعریف کردیم تبعیت کنه، پس پارامتر اول میشه کلاسی که ایونت رو فایر میکنه  یعنی کلاس جاری (فرم جستجو)، پارامتر دوم هم شامل اطلاعات موردنیازمون  هستش.به جای اون قطعه کد بالا، یعنی همون if و بدنه اون، میتونید از کد زیر استفاده کنید که خیلی خلاصه تره، ولی دقیقا همون کار قطعه کد بالارو انجام میدهItemSelected?.Invoke(this, args);اگر ایونتمون دنبال کننده ای نداشته باشه، ایونت برابر null خواهد بود. حالا متد OnItemSelected رو داخل رویداد دابل کلیک دیتاگرید ویو به این شکل  فراخوانی میکنیم و اطلاعاتی که لازم داریم رو از طریق ابجکت args به متد  OnItemSelected پاس میدیمOnItemSelected(new EventArgs 
{
	AccountNumber = Convert.ToString(dgv.SelectedRow.Cells[&amp;quotAccountNumber&amp;quot].Value),
	AccountOwner = // get the Account Owner 
});الان ما به فرم جستجومون (که ایونت رو داخل اون تعریف کردیم) publisher یا  انتشاردهنده میگیم و میتونیم از این ایونت توی هر فرمی که لازم باشه به  راحتی استفاده کنیم، نحوه استفاده از این ایونت به شکل زیره، فرضا توی فرم 1  هستیم و لازم داریم که فرم جستجو رو باز کنیم و از ایتمی که توی فرم جستجو  انتخاب میشه استفاده کنیم:var searchingForm = new frmSearchingForm();
searchingForm.ItemSelected += frmSearchingForm_ItemSelected;

private void frmSearchingForm_ItemSelected(object sender, EventArgs args)
{
	// now your data is stored in args
}توی کد بالا به ایونت هندلر frmSearchingForm_ItemSelected که توی فرم 1  داره ایونت ItemSelected توی فرم جستجو رو فراخوانی میکنه میگیم subscriber  یا دنبال کننده اون ایونت (به تبع اون به کلاس فرم 1 هم دنبال کننده  میگیم) کار تمومه. اما حالا درمورد اون کلاس custom eventargs که گفتم، باید یه کلاس تعریف  کنید که از کلاس EventArgs ارث بری میکنه، و براش پراپرتی هایی که لازم  دارین رو تعریف کنین:public class SearchEventArgs : EventArgs
{
	public string AccountNumber {get; set;}
	public string AccountOwner {get; set;}
}و برای استفاده از این کلاس باید توی کد های بالا، به جای تمامی EventArgs ها از کلاس SearchEventArgs استفاده کنید. نکته دیگه اینکه شما به جای تعریف یک دلیگیت میتونین از دلیگیت تعریف شده  توی خود دات نت استفاده کنین، پس مرحله اول حذف میشه و فقط از مرحله دوم  کار رو شروع میکنین، یکی از این دلیگیت های پیش فرض دلیگیت EventHandler  هستش که باید از نوع جنریکش استفاده کنید و نوع SearchEventArgs رو بهش  بدین، به این صورت:public event EventHandler&lt;SearchEventArgs&gt; ItemSelected;اگر از دلیگیت پیشفرض خود دات نت استفاده کنین، میتونین اون دلیگیتی که خودمون تعریف کردیم رو پاک کنین و مستقیما ایونت رو بسازیناین آموزش رو خیلی سال پیش توی این تاپیک داخل فوروم برنامه نویس نوشته بودم.</description>
                <category>سیروان شریعت پناه</category>
                <author>سیروان شریعت پناه</author>
                <pubDate>Mon, 03 Apr 2023 11:14:01 +0330</pubDate>
            </item>
                    <item>
                <title>معرفی نرم افزار حسابداری فروشگاهی فانوس</title>
                <link>https://virgool.io/@xeedio/%D9%85%D8%B9%D8%B1%D9%81%DB%8C-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-%D8%AD%D8%B3%D8%A7%D8%A8%D8%AF%D8%A7%D8%B1%DB%8C-%D9%81%D8%B1%D9%88%D8%B4%DA%AF%D8%A7%D9%87%DB%8C-%D9%81%D8%A7%D9%86%D9%88%D8%B3-zucgzeeqe8hg</link>
                <description>نرم افزار حسابداری فروشگاه فانوس، نرم افزاری زیبا و بسیار کاربردی  است که برای فروشگاه های کوچک و متوسط با هر زمینه کاری مناسب می باشد. در  این نرم افزار سعی شده که با استفاده از متدهای بروز و با رعایت سادگی،  قابلیت های کم نظیری برای کاربران فراهم شود و کاربران بتوانند با داشتن  حداقل دانش حسابداری امور مربوطه را انجام دهند.جهت دانلود نسخه آزمایشی به لینک زیر مراجعه نمایید: https://lanternsoft.ir/Home/LanternStoreAccounting برخی از ویژگی های برجسته نرم افزار:امکان تعریف واحدهای اندازه گیری و دسته بندی کالاهاامکان تعریف کالا و مدیریت انبارامکان تعیین کالاها بصورت اعشارپذیر و یا بدون اعشارانبار گردانی حرفه ای و در عین حال ساده و راحتفیلتر کردن کالاها براساس نوع دسته بندی، اعشارپذیری، قیمت فروش، موجودی، تعداد فروش رفتهامکان انتخاب و تعریف تصویر برای محصولاتامکان اتصال به وبکم و تصویر برداری جهت محصولاتامکان تعیین قیمت فروش کالا به عنوان درصدی از قیمت خریدامکان تغییر درصدی قیمت فروش کالاها بصورت دسته جمعیامکان مشاهده تعداد فروش رفته هر کالا به تفکیکامکان اتصال به دستگاه بارکدخوانامکان تولید و چاپ بارکد برای کالاها بصورت تکی و کلیتولید بارکد بصورت اتوماتیک و تصادفیتولید بارکد برای کالاها براساس تعداد موجودی هر کالاثبت و چاپ فاکتورهای خرید و فروشثبت توضحیات برای هر فاکتورثبت هزینه خدمات، اضافه بر کالاها برای هر فاکتورثبت سریع کالاها در فاکتورهای فروش توسط بارکدخواننمایش هشدار هنگام وارد کردن قیمت فروش کمتر از قیمت خرید برای کالاهاامکان مشاهده سوابق مالی اشخاص در هنگام صدور فاکتورامکان چاپ فاکتورها در سایز A4 و A5 و فیش پرینتر 8 سانتی متریامکان چاپ فاکتورها توسط فیش پرینترامکان چاپ سریع فاکتور بدون پیشنمایشامکان چاپ فاکتور هنگام ثبت نهاییچاپ فاکتور ارزش افزوده ویژه دارایی جهت ارائه به سازمان امور مالیاتی کشورامکان ثبت برگشتی برای فاکتورهای خرید و فروش و کسر/بازگشت به انبارامکان تسویه فوری فاکتور در هنگام ثبتامکان ذخیره فاکتور با فرمت های: PDF, DOC, HTML, XPF, PPT, EXL, DAT, IMG, ODT, RTF, TXT, ODSامکان تعریف مشتری هاامکان تعیین کد اشتراک برای هر مشتریامکان تعیین نوع جستجوی مشتری براساس فیلدهای مختلفامکان تعریف ویزیتورهاامکان تعیین ویزیتور / کاربر ثبت کننده فاکتورهاامکان ثبت پرداختی ها و دریافتی ها از مشتری و تامین کننده هاامکان ثبت چک های دریافتی و پرداختینمایش هشدار سررسید چک‌هاامکان تعیین وضعیت چک های ثبت شده (در جریان، برگشتی، وصول شده)رسم نمودارهای دایره ای، میله ای و منطقه ایرسم نمودارهای میزان سود خالص بصورت روزانه (از شنبه تا جمعه)، هفتگی، ماهانه و سالیانهرسم نمودارهای میزان فروش محصولات بصورت روزانه (از شنبه تا جمعه)، هفتگی، ماهانه و سالیانهرسم نمودار پرفروش ترین محصولاتامکان ذخیره و یا چاپ نمودارهای رسم شدهمحاسبه دقیق میزان سود خالص به ازای هر فاکتور فروشمحاسبه دقیق میزان سود خالص به ازای هر قلم جنس فروش رفتهامکان مقایسه تعداد فروش هر کالا به تفکیک در بازه های زمانی سالانه و ماهانهامکان فروش فوری (با این امکان می توان فاکتور فروش را با سرعت بالا و بدون نیاز به داشتن اطلاعات خریدار ثبت نمود.)نمایش خلاصه ای از وضعیت مالی فروشگاه در  داشبورد نرم افزار (مجموع سود، مجموع فروش، مجموع خرید، وضعیت چک ها، وضعیت  انبار و نمودارهای پروفروش ترین محصولات و میزان فروش روزانه)نمایش ارزش تومانی/ریالی کالاهای موجود در فروشگاهگزارش چک های دریافتی و پرداختیامکان ثبت یادآوری جهت پیگیری امورامکان خروجی گرفتن از اطلاعات و گزارشات در قالب فایل اکسل در تمامی پنجره هاامکان وارد کردن کالاها و اجناس به بخش انبار از طریق فایل اکسل با استفاده از ابزار حرفه ای و پیشرفتهامکان تعیین تعداد رکورد قابل نمایش در هر پنجرهامکان تعیین نوع ارز در نرم افزار (تومان یا ریال)امکان تعریف نامحدود کاربران و تعیین سطح دسترسی آن ها به امکانات نرم افزارامکان تنظیم پاورقی جهت چاپ در فاکتور ها و گزارشاتامکان تنظیم درصد ارزش افزوده برای فاکتورهای خرید و فروشامکان تنظیم نحوه نمایش ارزش افزوده در فاکتورها (نمایش درصدی و تومانی/ریالی)امکان تنظیم لوگوی فروشگاه جهت چاپ در فاکتورها و گزارشاتامکان تنظیم تصویر مهر و امضاء فروشگاه جهت چاپ در فاکتورهاامکان سفارشی سازی تنظیمات عمومی نرم افزار جهت سهولت در کار با نرم افزار توسط کاربرامکان گزارش گیری از لیست مشتری ها و تامین کننده هاامکان تهیه گزارش از میزان سودآوری و تعدد خرید مشتریان به تفکیک و در بازه های زمانی مختلفامکان گزارش گیری از وضعیت بدهکاری و بستانکاری مشتریان و تامین کننده هاامکان گزارش گیری از لیست پرداختی ها، فاکتورهای خرید و فروش و میزان سود و زیان فاکتورهاامکان تهیه گزارشات کاملی از سوابق مشتری و تامین کننده ها اعم از فاکتورها، پرداختی ها و برگشتی هاامکان گزارش گیری از تاریخچه خریدهای کالا (کاردکس کالا)، موجودی انبار، کالاهای بدون موجودی و کالاهای فروش نرفتهامکان مشاهده و گزارش گیری از تاریخچه فروش های هر کالاامکان گزارشگیری از فاکتورهای ثبت شده توسط هر ویزیتور / کاربرامکان گزارشگیری از اقلام فروخته شده توسط هر ویزیتور / کاربرامکان حذف و پاکسازی تمامی اطلاعات وارد شده در برنامه بدون نیاز به حذف نرم افزارامکان استفاده از نرم افزار توسط کلیدهای میانبرامکان پشتیبان گیری و بازیابی اطلاعاتارائه آپدیت های مداوم و کاملا رایگانو...</description>
                <category>سیروان شریعت پناه</category>
                <author>سیروان شریعت پناه</author>
                <pubDate>Tue, 31 May 2022 12:33:57 +0430</pubDate>
            </item>
            </channel>
</rss>