public ActionResult DocumentEditRows(ProductLine editedItem) { // Get the grid and database models var gridModel = new SkladJqGridModel(); var datacontextModel = new SkladDataContext(); int documentId = -1; // If we are in "Edit" mode if (gridModel.ProductLineGrid.AjaxCallBackMode == AjaxCallBackMode.EditRow) { // Get the data from and find the item corresponding to the edited row ProductLine item = (from x in datacontextModel.ProductLines where x.ProductLineId == editedItem.ProductLineId select x).First<ProductLine>(); // update the Order information UpdateProductLine(item, editedItem); // save comment to iriginal product item description var product = datacontextModel.Products.Where(x => x.ProductId == item.ProductId).FirstOrDefault(); if (product != null) { if (String.IsNullOrEmpty(product.Description)) { product.Description = editedItem.Comment; } else if (product.Description.IndexOf(editedItem.Comment) == -1) { product.Description += ". " + editedItem.Comment; } else product.Description = editedItem.Comment; } documentId = item.DocumentId; datacontextModel.SaveChanges(); } if (gridModel.ProductLineGrid.AjaxCallBackMode == AjaxCallBackMode.DeleteRow) { ProductLine item = (from x in datacontextModel.ProductLines where x.ProductLineId == editedItem.ProductLineId select x) .First<ProductLine>(); documentId = item.DocumentId; // delete the record datacontextModel.ProductLines.Remove(item); datacontextModel.SaveChanges(); } var document = datacontextModel.Documents.Where(x => x.DocumentId == documentId).FirstOrDefault(); if (document != null) { document.IsReportOutdated = true; datacontextModel.SaveChanges(); } // Add //DocumentOperation operation = new DocumentOperation(); //operation.UpdateDocument(datacontextModel, documentId); return RedirectToAction("Document", "Home", new { documentId = documentId }); }
public ActionResult Document(IEnumerable<HttpPostedFileBase> files, int? documentId, int doctypeId) { int? contractorId =null; string contractorIdStr = Request.Params["contractorId"].ToString(); if (!String.IsNullOrEmpty(contractorIdStr)) { int contractorIdInt = 0; Int32.TryParse(contractorIdStr, out contractorIdInt); if (contractorIdInt <= 0) return Json(new { message = "Сначала выберите контрагента!", documentId = -1 }); contractorId = contractorIdInt; } string docNumber = Request.Params["docNumber"]; DateTime docCreatedOf = DateTime.Now; if(Request.Params["docCreatedOf"] != null) { docCreatedOf = Convert.ToDateTime(Request.Params["docCreatedOf"].ToString()); } foreach (var file in files) { if (file.ContentLength > 0) { //Stream uploadFileStream = file.InputStream; // If the file uploaded is "XLSX", convert it's Sheet1 to a NPOI document if (file.FileName.EndsWith("xlsx")) { //logger.InfoFormat("Загружается файл:{0}", file.FileName); string extension = ".xlsx"; string uploadsPath = Server.MapPath("~/uploads"); var filename = Path.Combine(uploadsPath, Session.LCID.ToString() + extension); if (!Directory.Exists(uploadsPath)) { Directory.CreateDirectory(uploadsPath); } file.SaveAs(filename); //logger.InfoFormat("Загружен файл:{0}", filename); var products = ExcelHelper.GetProductsData(filename, extension, "ProductLine-Template"); if (products != null) { // TODO: dublicated code. Merge with code in AddNewProductLine() method var datacontextModel = new SkladDataContext(); // Add DocumentId if null Document document = null; if (documentId == null || documentId <= 0) { DocumentOperation docOp = new DocumentOperation(); docNumber = String.IsNullOrEmpty(docNumber) ? docOp.GetDocumentNumber(datacontextModel, DateTime.Now.Year, doctypeId).ToString() : docNumber.Trim().Replace(" ", ""); string secureFolderName = GenerateFolderName(String.Empty); string commonFolderName = GenerateFolderName(secureFolderName); // Create new document document = new Document { DocumentTypeId = doctypeId, CreatedOf = docCreatedOf, Comment = String.Empty, CreatedAt = DateTime.Now, Number = docNumber, IsCommitted = false, SecureFolderName = secureFolderName, CommonFolderName = commonFolderName, IsReportOutdated = true, }; datacontextModel.Documents.Add(document); datacontextModel.SaveChanges(); document = datacontextModel.Documents.Where(x => x.Number == docNumber && x.DocumentTypeId == doctypeId && x.CreatedAt.Year == document.CreatedAt.Year && x.CreatedAt.Month == document.CreatedAt.Month && x.CreatedAt.Day == document.CreatedAt.Day && x.CreatedAt.Hour == document.CreatedAt.Hour && x.CreatedAt.Minute == document.CreatedAt.Minute).FirstOrDefault(); } else { document = datacontextModel.Documents.Where(x => x.DocumentId == documentId).FirstOrDefault(); } if (document == null) return Json(new { message = String.Format("Не найден документ {0}!", documentId), documentId = -1 }); var contractor = datacontextModel.Contractors.Where(x => x.ContractorId == contractorId).FirstOrDefault(); if (contractor == null) return Json(new { message = String.Format("Не найден контрагент {0}!", contractorId), documentId = -1 }); foreach (var productLine in products) { string article = productLine.ProductArticle.Trim().ToLower().Replace(" ", ""); var supplier = datacontextModel.Contractors.Where(x => x.Code == productLine.SupplierCode.Trim() && x.ContractorTypeId == (int)EntityEnum.ContractorTypeEnum.Factory).FirstOrDefault(); if (supplier == null) return Json(new { message = String.Format("Фабрика {0} не найдена!", productLine.SupplierCode.Trim()), documentId = -1 }); decimal marginAbs = 0; if (productLine.MarginAbs > 0) marginAbs = productLine.MarginAbs; else if (productLine.SalePrice > 0) { marginAbs = Math.Abs(productLine.SalePrice - productLine.PurchasePrice); if (marginAbs == 0) marginAbs = contractor.MarginAbs; } else marginAbs = contractor.MarginAbs; Product product = GetOrCreateProduct(datacontextModel, supplier.ContractorId, productLine.PurchasePrice, marginAbs, article, String.Empty); // Check if this productline already exists in document. if so, just // change it value ProductLine line = datacontextModel.ProductLines.Where(x => x.ProductId == product.ProductId && x.DocumentId == document.DocumentId).FirstOrDefault(); string comment = productLine.Comment; if (comment != null) comment = comment.Trim(); if (line == null) { // Attach productLine to document line = new ProductLine { ProductArticle = article, SupplierCode = supplier.Code, SupplierId = supplier.ContractorId, Quantity = productLine.Quantity, PurchasePrice = productLine.PurchasePrice, SalePrice = productLine.PurchasePrice + marginAbs, MarginAbs = marginAbs, Discount = productLine.Discount, Comment = comment, ProductId = product.ProductId, DocumentId = document.DocumentId, Sum = productLine.Quantity * productLine.PurchasePrice, SaleSum = productLine.Quantity * (productLine.PurchasePrice + marginAbs) }; if (document.Products == null) document.Products = new List<ProductLine>(); document.Products.Add(line); } else { line.ProductArticle = article; line.SupplierCode = supplier.Code; line.SupplierId = supplier.ContractorId; line.Quantity = productLine.Quantity; line.PurchasePrice = productLine.PurchasePrice; line.SalePrice = productLine.PurchasePrice + marginAbs; line.MarginAbs = marginAbs; line.Comment = comment; line.Discount = productLine.Discount; line.ProductId = product.ProductId; line.Sum = productLine.Quantity * productLine.PurchasePrice; line.SaleSum = productLine.Quantity * (productLine.PurchasePrice + marginAbs); } document.IsReportOutdated = true; datacontextModel.SaveChanges(); } document.IsReportOutdated = true; datacontextModel.SaveChanges(); return Json(new { message = "Документ успешно обновлен/добавлен", documentId = document.DocumentId }); } } else { return Json(new { message = "Вы можете загружать только файлы Excel 2007-2010!", documentId = -1 }); } } } return Json(new { message = "Возникла критическая ошибка!", documentId = -1 }); }
public int AddNewProductLine(int? documentId, int doctypeId, string docNumber, DateTime docCreatedOf, string docComment, int supplierId, string article, decimal purchaseprice, decimal marginabs, decimal discount, int quantity, int quantityW, string comment) { if (supplierId <= 0 || String.IsNullOrEmpty(article) || purchaseprice < 0 || doctypeId <= 0 ) return -1; var datacontextModel = new SkladDataContext(); // check for valid supplier var supplier = datacontextModel.Contractors.Where(x => x.ContractorId == supplierId && x.ContractorTypeId == (int)EntityEnum.ContractorTypeEnum.Factory).FirstOrDefault(); if (supplier == null) return -1; article = article.Trim().Replace(" ","").ToLower(); comment = comment.Trim(); // get product Product product = GetOrCreateProduct(datacontextModel, supplierId, purchaseprice, marginabs, article, comment); // Add DocumentId if null Document document = null; if (documentId == null || documentId <= 0) { DocumentOperation docOp = new DocumentOperation(); docNumber = String.IsNullOrEmpty(docNumber) ? docOp.GetDocumentNumber(datacontextModel, DateTime.Now.Year, doctypeId).ToString() : docNumber.Trim().Replace(" ", ""); string secureFolderName = GenerateFolderName(String.Empty); string commonFolderName = GenerateFolderName(secureFolderName); // Create new document document = new Document { DocumentTypeId = doctypeId, CreatedOf = docCreatedOf, Comment = docComment, CreatedAt = DateTime.Now, Number = docNumber, IsCommitted = false, SecureFolderName = secureFolderName, CommonFolderName = commonFolderName, IsReportOutdated = true, }; datacontextModel.Documents.Add(document); datacontextModel.SaveChanges(); document = datacontextModel.Documents.Where(x => x.Number == docNumber && x.DocumentTypeId == doctypeId && x.CreatedAt.Year == document.CreatedAt.Year && x.CreatedAt.Month == document.CreatedAt.Month && x.CreatedAt.Day == document.CreatedAt.Day && x.CreatedAt.Hour == document.CreatedAt.Hour && x.CreatedAt.Minute == document.CreatedAt.Minute).FirstOrDefault(); } else { document = datacontextModel.Documents.Where(x => x.DocumentId == documentId).FirstOrDefault(); } if (document == null) { logger.ErrorFormat("Ошибка создания документа № {0} от {1}", docNumber, docCreatedOf); return -1; } document.IsReportOutdated = true; // Check if this productline already exists in document. if so, just // change it value ProductLine line = datacontextModel.ProductLines.Where(x => x.ProductId == product.ProductId && x.DocumentId == document.DocumentId).FirstOrDefault(); string productComment = comment; // int productQuantity = quantity; if (quantityW > 0) { productComment += "со склада [" + quantityW + "] ед. "; } if (line == null) { // Attach productLine to document line = new ProductLine { ProductArticle = article, SupplierCode = supplier.Code, SupplierId = supplier.ContractorId, Quantity = quantity + quantityW, PurchasePrice = purchaseprice, SalePrice = purchaseprice + marginabs, MarginAbs = marginabs, Discount = discount, Comment = productComment, ProductId = product.ProductId, DocumentId = document.DocumentId, Sum = (quantity + quantityW) * purchaseprice, SaleSum = (quantity + quantityW) * (purchaseprice + marginabs) }; if (document.Products == null) document.Products = new List<ProductLine>(); document.Products.Add(line); } else { line.ProductArticle = article; line.SupplierCode = supplier.Code; line.SupplierId = supplier.ContractorId; line.Quantity = quantity + quantityW; line.PurchasePrice = purchaseprice; line.MarginAbs = marginabs; line.Discount = discount; line.SalePrice = purchaseprice + marginabs; line.Comment = productComment; line.ProductId = product.ProductId; line.Sum = (quantity + quantityW) * purchaseprice; line.SaleSum = (quantity + quantityW) * (purchaseprice + marginabs); } // обновить документы оприходования где имеется этот товар RemoveProductFromPostingDocument(datacontextModel, product.ProductId, quantityW); datacontextModel.SaveChanges(); return document.DocumentId; }
private void UpdateProductLine(ProductLine item, ProductLine editedItem) { item.PurchasePrice = editedItem.PurchasePrice; item.SalePrice = editedItem.PurchasePrice + editedItem.MarginAbs; item.MarginAbs = editedItem.MarginAbs; item.Quantity = editedItem.Quantity; item.Discount = editedItem.Discount; item.Comment = (editedItem.Comment ?? String.Empty).Trim(); item.Sum = editedItem.Quantity * editedItem.PurchasePrice; item.SaleSum = editedItem.Quantity * (editedItem.PurchasePrice + editedItem.MarginAbs); }