public virtual void AddSaleDetail(ProductSaleDetail productSaleDetail) { #region اگر تخفیف از حد مجاز بیشتر بود، به اندازه حداکثر شود if (productSaleDetail.Discount > productSaleDetail.ProductPrice.MaxDiscount) { productSaleDetail.Discount = productSaleDetail.ProductPrice.MaxDiscount; } #endregion #region اگر آیتم تکراری وارد شد، فقط تعداد و تخفیف آیتم موجود آپدیت شود if (ProductSaleDetails.Contains(productSaleDetail)) { ProductSaleDetails.FirstOrDefault(w => w == productSaleDetail).Units += productSaleDetail.Units; ProductSaleDetails.FirstOrDefault(w => w == productSaleDetail).Discount += productSaleDetail.Discount; } #endregion #region در غیر اینصورت آیتم ذخیره شود else { productSaleDetail.Sale = this; ProductSaleDetails.Add(productSaleDetail); } #endregion }
/// <summary> /// Add Rollback sale /// </summary> /// <param name="RollbackSale">Rollbacked Sale</param> public virtual void AddRollbackSale(Sale RollbackSale) { #region چک کردن اینکه فاکتور جاری فاکتور برگشت نباشد if (IsRollbackSale) { _bussinessRules.Add(SaleBusinessRules.ThisIsRollback); return; } #endregion #region آیا آیتم های فاکتور برگشتی با آیتم های فاکتور اصلی متفاوت نیست؟ foreach (ProductSaleDetail productSaleDetail in RollbackSale.ProductSaleDetails) { if (!this.ProductSaleDetails.Contains(productSaleDetail)) { _bussinessRules.Add(SaleBusinessRules.SomeProductsNotExists); return; } } foreach (CreditSaleDetail creditSaleDetail in RollbackSale.CreditSaleDetails) { if (!this.CreditSaleDetails.Contains(creditSaleDetail)) { _bussinessRules.Add(SaleBusinessRules.SomeCreditsNotExists); return; } } foreach (UncreditSaleDetail uncreditSaleDetail in RollbackSale.UncreditSaleDetails) { if (!this.UncreditSaleDetails.Contains(uncreditSaleDetail)) { _bussinessRules.Add(SaleBusinessRules.SomeUncreditsNotExists); return; } } #endregion #region آیتمهای موجود در فاکتور برگشت قبلاً برگشت نشده باشند foreach (ProductSaleDetail productSaleDetail in RollbackSale.ProductSaleDetails) { if (ProductSaleDetails.FirstOrDefault(w => w == productSaleDetail).Status == SaleDetailStatus.Rollbacked) { _bussinessRules.Add(SaleBusinessRules.SomeProductsBeforeRollbacked); return; } } foreach (CreditSaleDetail creditSaleDetail in RollbackSale.CreditSaleDetails) { if (CreditSaleDetails.FirstOrDefault(w => w == creditSaleDetail).Status == SaleDetailStatus.Rollbacked) { _bussinessRules.Add(SaleBusinessRules.SomeCreditsBeforeRollbacked); return; } } foreach (UncreditSaleDetail uncreditSaleDetail in RollbackSale.UncreditSaleDetails) { if (UncreditSaleDetails.FirstOrDefault(w => w == uncreditSaleDetail).Status == SaleDetailStatus.Rollbacked) { _bussinessRules.Add(SaleBusinessRules.SomeUncreditsBeforeRollbacked); return; } } #endregion #region برای تک تک آیتم های فاکتور برگشتی #region خدمات اعتباری foreach (CreditSaleDetail creditSaleDetail in RollbackSale.CreditSaleDetails) { //تخفیف صفر شود //creditSaleDetail.Discount = creditSaleDetail.Discount; // مالیات صفر شود //creditSaleDetail.Imposition = creditSaleDetail.Imposition; //creditSaleDetail.LineDiscount = creditSaleDetail.LineDiscount; //creditSaleDetail.LineImposition = creditSaleDetail.LineImposition; //creditSaleDetail.Rollbacked = true; creditSaleDetail.IsRollbackDetail = true; creditSaleDetail.ModifiedDate = PersianDateTime.Now; //if (creditSaleDetail.Delivered) // creditSaleDetail.Status = SaleDetailStatus.DeliveredAndRollbacked; //else // creditSaleDetail.Status = SaleDetailStatus.Rollbacked; // تعداد 1 شود //creditSaleDetail.Units = 1; // چک کردن مبلغ برگشتی که بیش از مبلغ فاکتور نباشد if (creditSaleDetail.UnitPrice > CreditSaleDetails.First(w => w == creditSaleDetail).UnitPrice) { _bussinessRules.Add(SaleBusinessRules.RollbackCreditGreaterThanMain); return; } // اگر تحویل شده باشد موجودی شبکه بروز شود if (CreditSaleDetails.First(w => w == creditSaleDetail).Status == SaleDetailStatus.Delivered) { // چک کردن مبلغ برگشتی به شبکه که بیش از قیمت خرید نباشد if (creditSaleDetail.PurchaseUnitPrice > CreditSaleDetails.First(w => w == creditSaleDetail).UnitPrice) { _bussinessRules.Add(SaleBusinessRules.RollbackCreditkGreaterThanMain); return; } // بروز رسانی موجودی شبکه CreditSaleDetails.First(w => w == creditSaleDetail).CreditService.Network.Balance += // به اندازه ای که از کاربر پرسیده می شود به شبکه برمی گردد creditSaleDetail.PurchaseUnitPrice; } } #endregion #region خدمات غیر اعتباری foreach (UncreditSaleDetail uncreditSaleDetail in RollbackSale.UncreditSaleDetails) { //// تخفیف صفر شود uncreditSaleDetail.Discount = uncreditSaleDetail.Discount; //// مالیات صفر شود uncreditSaleDetail.Imposition = uncreditSaleDetail.Imposition; uncreditSaleDetail.LineDiscount = uncreditSaleDetail.LineDiscount; uncreditSaleDetail.LineImposition = uncreditSaleDetail.LineImposition; // تعداد 1 شود //uncreditSaleDetail.Units = uncreditSaleDetail.Units; //uncreditSaleDetail.Rollbacked = true; uncreditSaleDetail.IsRollbackDetail = true; uncreditSaleDetail.ModifiedDate = PersianDateTime.Now; //if (uncreditSaleDetail.Delivered) // uncreditSaleDetail.Status = SaleDetailStatus.DeliveredAndRollbacked; //else // uncreditSaleDetail.Status = SaleDetailStatus.Rollbacked; // چک کردن مبلغ برگشتی که بیش از مبلغ فاکتور نباشد if (uncreditSaleDetail.UnitPrice > UncreditSaleDetails.First(w => w == uncreditSaleDetail).UnitPrice) { _bussinessRules.Add(SaleBusinessRules.RollbackUncreditGreaterThanMain); return; } } #endregion #region کالاها foreach (ProductSaleDetail productSaleDetail in RollbackSale.ProductSaleDetails) { //// تخفیف صفر شود productSaleDetail.Discount = productSaleDetail.Discount; //// مالیات صفر شود productSaleDetail.Imposition = productSaleDetail.Imposition; productSaleDetail.LineDiscount = productSaleDetail.LineDiscount; productSaleDetail.LineImposition = productSaleDetail.LineImposition; // تعداد 1 شود productSaleDetail.Units = productSaleDetail.Units; //productSaleDetail.Rollbacked = true; productSaleDetail.IsRollbackDetail = true; productSaleDetail.ModifiedDate = PersianDateTime.Now; //if (productSaleDetail.Delivered) // productSaleDetail.Status = SaleDetailStatus.DeliveredAndRollbacked; //else // productSaleDetail.Status = SaleDetailStatus.Rollbacked; // چک کردن مبلغ برگشتی به حساب مشتری که بیش از مبلغ فاکتور نباشد if (productSaleDetail.UnitPrice > ProductSaleDetails.First(w => w == productSaleDetail).UnitPrice) { _bussinessRules.Add(SaleBusinessRules.RollbackProductGreaterThanMain); return; } // اگر قبلا تحویل شده باشد موجودی کالاها بروز شود if (ProductSaleDetails.First(w => w == productSaleDetail).Status == SaleDetailStatus.Delivered) { // بروزرسانی موجودی کالا در انبار this.ProductSaleDetails.First(w => w == productSaleDetail).ProductPrice.Product.UnitsInStock += // به اندازه تعداد فروخته شده به انبار برمیگردد ProductSaleDetails.First(w => w == productSaleDetail).Units; } } #endregion #endregion #region بروز رسانی حساب مشتری // توضیح اینکه مبلغ بازگشتی به حساب مشتری در مورد فروشهای // اعتباری با مبلغ بازگشتی به شبکه متفاوت است // و به اندازه جمع یونیت پرایز می باشد // بروز رسانی حساب مشتری ربطی به تحویل یا عدم تحویل ندارد //Customer.Balance += SaleTotal; #endregion #region افزودن فاکتور برگشت از فروش // اگر کامپایلر به اینجا رسید یعنی هیچ مشکلی وجود ندارد // فاکتور برگشت از فروش بصورت پیش فرض تأیید شده است RollbackSale.Close(RollbackSale.CreateEmployee); RollbackedSales.Add(RollbackSale); #endregion }