private void CheckToBackToOrderInsertFormIfStuffsEmpty()
 {
     if (AllStuffsData.All(a => a.TotalStuffQuantity <= 0))
     {
         try { Navigation.PopAsync(); } catch (Exception) { }
     }
 }
        private void ToolbarItem_OrderPreviewForm_Activated(object sender, EventArgs e)
        {
            FocusedQuantityTextBoxId = null;
            if (SelectedPartner == null && !SettlementTypeId.HasValue)
            {
                App.ShowError("خطا", "مشتری و نحوه تسویه را مشخص کنید.", "خوب");
                return;
            }
            else if (SelectedPartner == null)
            {
                App.ShowError("خطا", "مشتری را مشخص کنید.", "خوب");
                return;
            }
            else if (!SettlementTypeId.HasValue)
            {
                App.ShowError("خطا", "نحوه تسویه را مشخص کنید.", "خوب");
                return;
            }

            var WithoutPriceStuffs = AllStuffsData.Where(a => a.Quantity != 0 && !a._UnitPrice.HasValue).ToList();

            if (WithoutPriceStuffs.Any())
            {
                var Message = "برخی اقلام در لیست قیمت این مشتری ثبت نشده اند:\n" + WithoutPriceStuffs.Select(a => a.StuffData.Name).Aggregate((sum, x) => sum + "\n" + x);
                App.ShowError("خطا", Message, "خوب");
                return;
            }

            SaleOrder SaleOrder;

            try
            {
                SaleOrder = MakeOrder(SelectedPartner.Id, SettlementTypeId.Value, DescriptionEditor.Text);
            }
            catch (Exception err)
            {
                App.ShowError("خطا", err.ProperMessage(), "خوب");
                return;
            }

            var OrderPreviewForm = new OrderPreviewForm(SaleOrder, OrdersForm, PartnerListForm, OrderInsertForm, this, true)
            {
                StartColor = Color.FromHex("ffffff"),
                EndColor   = Color.FromHex("ffffff")
            };

            this.Navigation.PushAsync(OrderPreviewForm);
        }
 public void UnitNameClicked(Guid StuffId)
 {
     FocusedQuantityTextBoxId = null;
     if (AllStuffsData != null)
     {
         var StuffModel = AllStuffsData.SingleOrDefault(a => a.StuffId == StuffId && !a.BatchNumberId.HasValue);
         if (StuffModel != null)
         {
             if (StuffModel.PackagesData.Count() > 1)
             {
                 var CurrentPackageIndex = StuffModel.PackagesData.Select((a, index) => new { a, index }).Single(a => StuffModel.SelectedPackage.Id == a.a.Package.Id).index;
                 var NewPackageIndex     = CurrentPackageIndex == StuffModel.PackagesData.Length - 1 ? 0 : CurrentPackageIndex + 1;
                 StuffModel.SelectedPackage = StuffModel.PackagesData[NewPackageIndex].Package;
             }
         }
     }
 }
 public void QuantityPlusClicked(Guid StuffId, Guid?BatchNumberId)
 {
     FocusedQuantityTextBoxId = null;
     if (AllStuffsData != null)
     {
         var StuffModel = AllStuffsData.SingleOrDefault(a => a.StuffId == StuffId);
         if (StuffModel != null)
         {
             if (BatchNumberId.HasValue)
             {
                 StuffModel = StuffModel.StuffRow_BatchNumberRows.SingleOrDefault(a => a.BatchNumberId == BatchNumberId);
             }
             if (BatchNumberId.HasValue || !StuffModel.HasBatchNumbers)
             {
                 StuffModel.Quantity++;
             }
         }
     }
 }
 public void QuantityMinusClicked(Guid StuffId, Guid?BatchNumberId)
 {
     FocusedQuantityTextBoxId = null;
     if (AllStuffsData != null)
     {
         var StuffModel = AllStuffsData.SingleOrDefault(a => a.StuffId == StuffId);
         if (StuffModel != null)
         {
             if (BatchNumberId.HasValue)
             {
                 StuffModel = StuffModel.StuffRow_BatchNumberRows.SingleOrDefault(a => a.BatchNumberId == BatchNumberId);
             }
             if (BatchNumberId.HasValue || !StuffModel.HasBatchNumbers)
             {
                 StuffModel.Quantity = StuffModel.Quantity > 0 ? StuffModel.Quantity - 1 : 0;
             }
         }
         CheckToBackToOrderInsertFormIfStuffsEmpty();
     }
 }
        private SaleOrder MakeOrder(Guid PartnerId, Guid SettlementTypeId, string Description)
        {
            var SaleOrder = new SaleOrder()
            {
                Id                    = EditingSaleOrderId.HasValue ? EditingSaleOrderId.Value : Guid.NewGuid(),
                PreCode               = null,
                InsertDateTime        = DateTime.Now,
                PartnerId             = PartnerId,
                SettlementTypeId      = SettlementTypeId,
                Description           = Description,
                CashPrise             = 0,
                DiscountPercent       = 0,
                GeoLocation_Latitude  = null, //TODO
                GeoLocation_Longitude = null, //TODO
                GeoLocation_Accuracy  = null, //TODO
                WarehouseId           = WarehouseId
            };

            var _SaleOrderStuffs = AllStuffsData.Where(a => !a.HasBatchNumbers).SelectMany(a => a.PackagesData.Where(b => b.Quantity != 0).Select(b => new { Stuff = a, BatchNumber = (DBRepository.StuffListModel)null, Package = b }))
                                   .Union(AllStuffsData.Where(a => a.HasBatchNumbers).SelectMany(a => a.StuffRow_BatchNumberRows.SelectMany(b => b.PackagesData.Where(c => c.Quantity != 0).Select(c => new { Stuff = a, BatchNumber = b, Package = c }))))
                                   .Select((a, index) => new
            {
                ArticleIndex    = index + 1,
                StuffData       = a.Stuff.StuffData,
                PackageData     = a.Package.Package,
                BatchNumberData = a.BatchNumber != null ? a.BatchNumber.BatchNumberData : null,
                Quantity        = a.Package.Quantity,
                PackagePrice    = a.Stuff._UnitPrice.Value * a.Package.Package.Coefficient
            }).Where(a => a.Quantity != 0).ToList();

            var MinSaleConflicts = _SaleOrderStuffs.GroupBy(a => a.StuffData).Where(a => a.Sum(b => b.Quantity * b.PackageData.Coefficient) < a.Key.MinForSale).ToArray();

            if (MinSaleConflicts.Any())
            {
                throw new Exception("کالا" + (MinSaleConflicts.Count() > 1 ? "ها" : "") + "ی زیر کمتر از حداقل تعیین شده در سیستم سفارش داده شده اند:\n" +
                                    MinSaleConflicts.Select(a => a.Key.Name + " (حداقل سفارش: " + a.Key.MinForSale + " " + a.Key.Packages.Single(b => b.Coefficient == 1).Name + ")").Aggregate((sum, x) => sum + "\n" + x));
            }

            var SaleCoefficientConflicts = _SaleOrderStuffs.Where(a => a.StuffData.SaleCoefficient != 0 && a.StuffData.SaleCoefficient != 1).GroupBy(a => a.StuffData).Where(a => a.Sum(b => b.Quantity * b.PackageData.Coefficient) % a.Key.SaleCoefficient != 0).ToArray();

            if (SaleCoefficientConflicts.Any())
            {
                throw new Exception("تعداد سفارش کالا" + (SaleCoefficientConflicts.Count() > 1 ? "ها" : "") + "ی زیر با ضریب فروش تعیین شده در سیستم مغایرت دارد:\n" +
                                    SaleCoefficientConflicts.Select(a => a.Key.Name + " (ضریب فروش: " + a.Key.SaleCoefficient + " " + a.Key.Packages.Single(b => b.Coefficient == 1).Name + ")").Aggregate((sum, x) => sum + "\n" + x));
            }

            var SaleOrderStuffs = _SaleOrderStuffs.Select(a => new SaleOrderStuff()
            {
                Id                    = Guid.NewGuid(),
                OrderId               = SaleOrder.Id,
                SaleOrder             = SaleOrder,
                ArticleIndex          = a.ArticleIndex,
                PackageId             = a.PackageData.Id,
                BatchNumberId         = a.BatchNumberData != null ? a.BatchNumberData.BatchNumberId : new Nullable <Guid>(),
                Quantity              = a.Quantity,
                SalePrice             = a.PackagePrice,
                DiscountPercent       = 0,
                VATPercent            = SaleOrder.Partner.CalculateVATForThisPerson && a.PackageData.Stuff.HasVAT ? App.VATPercent.Value : 0,
                FreeProduct           = false,
                FreeProduct_UnitPrice = null
            }).ToArray();

            var SaleOrderCashDiscounts = new CashDiscount[] { };

            SaleOrder.SaleOrderStuffs = SaleOrderStuffs;
            SaleOrder.CashDiscounts   = SaleOrderCashDiscounts;

            SaleOrder = App.DB.CalculateProporatedDiscount(SaleOrder);

            return(SaleOrder);
        }