示例#1
0
文件: Sale.cs 项目: zafariNet/Saman
        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
        }
示例#2
0
文件: Sale.cs 项目: zafariNet/Saman
        /// <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
        }