private string CreateRelatedDocument(SkladDataContext datacontextModel, int documentId, string selectedRowsIds) { Document parentDoc = datacontextModel.Documents.Include("Products").Where(x => x.DocumentId == documentId) .FirstOrDefault(); if(parentDoc == null) return Constants.ErrorUrl; // TODO: split selectedRowsIds to array of int. Transfer to a new document only items with specified ids. int newDocumentTypeId = 0; if(parentDoc.DocumentTypeId == (int)EntityEnum.DocumentTypeEnum.CustomerOrders) { newDocumentTypeId = (int)EntityEnum.DocumentTypeEnum.Shipment; } if(parentDoc.DocumentTypeId == (int)EntityEnum.DocumentTypeEnum.Shipment) { newDocumentTypeId = (int)EntityEnum.DocumentTypeEnum.Refunds; } if(newDocumentTypeId == 0) return Constants.ErrorUrl; DocumentOperation operation = new DocumentOperation(); string secureFolderName = GenerateFolderName(String.Empty); string commonFolderName = GenerateFolderName(secureFolderName); Document newDocument = new Document { Number = parentDoc.Number + "-" + operation.GetDocumentNumber(datacontextModel, DateTime.Now.Year,newDocumentTypeId).ToString(), CreatedOf = parentDoc.CreatedOf, ContractorId = parentDoc.ContractorId, EmployeeId = parentDoc.EmployeeId, CreatedAt = DateTime.Now, FromWarehouseId = parentDoc.FromWarehouseId, ToWarehouseId = parentDoc.ToWarehouseId, DocumentTypeId = newDocumentTypeId, ParentDocumentId = parentDoc.DocumentId, SecureFolderName = secureFolderName, CommonFolderName = commonFolderName, IsReportOutdated = true, }; datacontextModel.Documents.Add(newDocument); datacontextModel.SaveChanges(); newDocument = datacontextModel.Documents.Where(x => x.ParentDocumentId == parentDoc.DocumentId && x.DocumentTypeId == newDocumentTypeId && x.Number == newDocument.Number && x.CreatedAt.Year == newDocument.CreatedAt.Year && x.CreatedAt.Month == newDocument.CreatedAt.Month && x.CreatedAt.Day == newDocument.CreatedAt.Day ).FirstOrDefault(); //Clone list newDocument.Products = new List<ProductLine>(); //parentDoc.Products.Where(x => x.Shipped < x.Quantity) //.Select(c => { c.DocumentId = newDocument.DocumentId; c.Document = null; //c.Product = null; // return c; }).ToList() //); List<ProductLine> productsToCopy = null; if (!String.IsNullOrEmpty(selectedRowsIds)) { string[] idsStr = selectedRowsIds.Split(','); idsStr = idsStr.Where(x => !String.IsNullOrEmpty(x)).ToArray(); int[] ids = Array.ConvertAll<string, int>(idsStr, int.Parse); productsToCopy = parentDoc.Products.Where(x => x.Shipped < x.Quantity && ids.Contains(x.ProductLineId)) .ToList(); } else { productsToCopy = parentDoc.Products.Where(x => x.Shipped < x.Quantity) .ToList(); } /* * string values = "1,2,3,4,5,6,7,8,9,10"; string[] tokens = values.Split(','); int[] convertedItems = Array.ConvertAll<string, int>(tokens, int.Parse); * int[] ids = // populate ids var query = from e in db.SomeTable where ids.Contains(e.SuchID) select e */ foreach (var product in productsToCopy) { newDocument.Products.Add(new ProductLine { DocumentId = newDocument.DocumentId, ProductId = product.ProductId, SupplierId = product.SupplierId, ProductArticle = product.ProductArticle, SupplierCode = product.SupplierCode, Quantity = product.Quantity, Discount = product.Discount, Reserve = product.Reserve, Shipped = product.Shipped, Available = product.Available, PurchasePrice = product.PurchasePrice, SalePrice = product.SalePrice, MarginAbs = product.MarginAbs, Sum = product.Sum, SaleSum = product.SaleSum, VAT = product.VAT, IsPriceIncludesVAT = product.IsPriceIncludesVAT, Comment = product.Comment }); } datacontextModel.SaveChanges(); return "/Home/Document?documentId=" + newDocument.DocumentId; // Cre /* case (int)EntityEnum.DocumentTypeEnum.CustomerOrders: return "/Sale/CustomerOrders"; case (int)EntityEnum.DocumentTypeEnum.Shipment: return "/Sale/Shipment"; */ }
/* "docContractorId": $("#ContractorDocId").val(), "docEmployeeId": $("#DocumentItem_Employee_UserId").val(), "docPlanDate": $("#planDateDatepicker").datepicker("getDate").toJSONLocal(), */ public string SaveDocument(int documentId, string docNumber, DateTime docCreatedOf, string docComment, bool docIsComitted, int? docContractorId, int? docEmployeeId, DateTime? docPlanDate, bool createRelatedDoc, string selectedRowsIds ) { if (documentId <= 0) return Constants.ErrorUrl; var datacontextModel = new SkladDataContext(); var document = datacontextModel.Documents.Include("Products").Where(x => x.DocumentId == documentId).FirstOrDefault(); if (document == null) return Constants.ErrorUrl; if (document.DocumentTypeId == (int)EntityEnum.DocumentTypeEnum.Posting || document.DocumentTypeId == (int)EntityEnum.DocumentTypeEnum.Cancellation) { docContractorId = null; docEmployeeId = null; docPlanDate = null; } if (document.DocumentTypeId == (int)EntityEnum.DocumentTypeEnum.CustomerOrders || document.DocumentTypeId == (int)EntityEnum.DocumentTypeEnum.Refunds || document.DocumentTypeId == (int)EntityEnum.DocumentTypeEnum.Shipment) { if(docContractorId == null || docEmployeeId == null) return Constants.ErrorUrl; } if(!String.IsNullOrEmpty(docNumber)) document.Number = docNumber; document.CreatedOf = docCreatedOf; document.Comment = docComment; document.ContractorId = docContractorId; document.EmployeeId = docEmployeeId; document.PlannedDate = docPlanDate; document.IsReportOutdated = true; // calculate sum document.Sum = datacontextModel.ProductLines .Where(x => x.DocumentId == document.DocumentId).Sum(x => x.Sum); document.SaleSum = datacontextModel.ProductLines .Where(x => x.DocumentId == document.DocumentId).Sum(x => x.SaleSum); DocumentOperation docOperation = new DocumentOperation(); docOperation.UpdateDocument(datacontextModel, document.DocumentId); if (createRelatedDoc) docIsComitted = true; document.IsCommitted = docIsComitted; datacontextModel.SaveChanges(); // TODO: if there was ParentDocumentId than check all productLines // and update Shipped. if (document.ParentDocumentId != null) { // get parent document var parentDoc = datacontextModel.Documents.Include("Products").Where(x => x.DocumentId == document.ParentDocumentId) .FirstOrDefault(); if (parentDoc != null) { // TODO: Check all ProductLines that were shipped if (parentDoc.Products != null) { foreach (var product in parentDoc.Products) { int? shipped = 0; shipped = datacontextModel.ProductLines .Where(x => x.ProductId == product.ProductId && x.DocumentId == documentId) .Select(x => x.Quantity).FirstOrDefault(); if (shipped != null) product.Shipped = (int)shipped; } datacontextModel.SaveChanges(); } } } if (document.Products != null) docOperation.UpdateDocumentProducts(document.Products.ToList()); if (createRelatedDoc) return CreateRelatedDocument(datacontextModel, documentId, selectedRowsIds); return DocumentOperation.UrlToDocumentList(document.DocumentTypeId); }
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; }
public ActionResult DocumentItemEditRows(Document editedItem) { // Get the grid and database models var gridModel = new SkladJqGridModel(); var datacontextModel = new SkladDataContext(); // If we are in "Edit" mode if (gridModel.DocumentGrid.AjaxCallBackMode == AjaxCallBackMode.EditRow) { return RedirectToAction("Document", new { documentId = editedItem.DocumentId }); } if (gridModel.DocumentGrid.AjaxCallBackMode == AjaxCallBackMode.DeleteRow) { Document item = (from x in datacontextModel.Documents where x.DocumentId == editedItem.DocumentId select x) .First<Document>(); DocumentOperation operation = new DocumentOperation(); operation.DeleteDocument(datacontextModel, item); datacontextModel.Documents.Remove(item); datacontextModel.SaveChanges(); logger.InfoFormat("удален документ {0} от {1}", editedItem.Number, editedItem.CreatedOf); } return RedirectToDocumentList(editedItem.DocumentTypeId); }
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 }); }