public decimal GetSummaryTimeLimit(int WareID) { WareComponentsLogic componentsLogic = new WareComponentsLogic(manager); List <WareComponent> components = componentsLogic.GetAllRecursively(WareID, null); decimal suma = 0; foreach (WareComponent component in components) { //foreach } return(suma); }
/// <summary> /// Метод здійснює управління залишками /// 1. Спочатку шукаємо чи для даної одиниці у вказаний момент часу існує період, /// Якщо період існує то працюємо з ним, якщо ні - створюємо новий /// 2. Шукаємо період, що передує поточному /// Якщо попередній період знайдено - то дані в поточному періоді формуються на основі даних знайденого(інкрементально) /// 3. Залишок = Залишок попереднього періоду + Прихід - Розхід /// </summary> /// <param name="DocumentDetail"></param> /// <returns></returns> public int UpdateCurrentRemainByDocumentDetail(DateTime?StartPeriodDate, int?WareID, int?StructureObjectID, decimal?unitQuantity) { int result = 1; //визначаємо дату для якої необхідно зробити перерахунок DateTime Date = DateTime.Now; //if (DocumentDetail != null) // Date = Convert.ToDateTime(DocumentDetail.WareDocument.Date); if (StartPeriodDate != null) { Date = Convert.ToDateTime(StartPeriodDate); } //задаємо дані періоду DateTime StartDate = new DateTime(Date.Year, Date.Month, Date.Day, 0, 0, 0); DateTime EndDate = new DateTime(Date.Year, Date.Month, Date.Day, 23, 59, 59); //визначаємо перелік складових номенклатурної одиниці, для яких необхідно зробити перерахунок //обробка вкладених компонентів WareComponentsLogic componentsLogic = new WareComponentsLogic(manager); List <WareComponent> components = componentsLogic.GetAll(Convert.ToInt32(WareID)); foreach (WareComponent component in components) { this.UpdateCurrentRemainByDocumentDetail(StartDate, component.ComponentWareID, StructureObjectID, component.UnitQuantity); } //кінець обробки вкладених компонентів Compas.Logic.Documents.DocumentsLogic documentsLogic = new Compas.Logic.Documents.DocumentsLogic(manager); Compas.Logic.Documents.DocumentDetailsLogic detailsLogic = new Compas.Logic.Documents.DocumentDetailsLogic(manager); WareRemain output = null; WareRemain input = null; //спочатку шукаємо попередній запис, що не попадає в поточний період WareRemain lastRemain = (from a in context.WareRemains where a.EndDate < Date & a.WareID == WareID & a.StructureObjectID == StructureObjectID orderby a.StartDate descending select a).FirstOrDefault(); //якщо не знайдено но створюємо новий починаючи з 0 decimal lastRemainQuantity = 0; if (lastRemain != null) { lastRemainQuantity = lastRemain.UnitQuantity; } //шукаємо поточний залишок List <WareRemain> remains = (from a in context.WareRemains where a.StartDate == StartDate & a.WareID == WareID & a.StructureObjectID == StructureObjectID select a).ToList(); if (remains.Count() == 0) { //якщо поточного залишка не знайдено, то створюємо remains.Add(this.Create(Convert.ToInt32(StructureObjectID), Convert.ToInt32(WareID), lastRemainQuantity, StartDate, Convert.ToDateTime(EndDate))); } //проходимось по всім залишкам після вказаної дати List <WareRemain> remainsAfter = (from a in context.WareRemains where a.StartDate > StartDate & a.WareID == WareID & a.StructureObjectID == StructureObjectID select a).ToList(); remains.AddRange(remainsAfter); foreach (WareRemain remain in remains.OrderBy(a => a.StartDate)) { //прихід у вказаному періоді decimal inputQuantity = 0; //розхід у вказаному періоді decimal outputQuantity = 0; //основна одиниця if (unitQuantity == null) { //в межах кожного періоду проходимось по всім записам, що містять номенклатурну одиницю List <WareDocumentDetail> details = detailsLogic.GetAll(remain.StartDate, remain.EndDate, Convert.ToInt32(WareID)); foreach (WareDocumentDetail detail in details) { if (detail.WareDocument != null) { if (detail.WareDocument.WareDocumentType.Input == true) { //прихід inputQuantity = inputQuantity + detail.UnitQuantity; } if (detail.WareDocument.WareDocumentType.Output == true) { //розхід outputQuantity = outputQuantity + detail.UnitQuantity; } } } } //компонент if (unitQuantity != null) { //якщо одиниця багатокомпонента, то компоненти завжди списуються в розхід outputQuantity = outputQuantity + Convert.ToDecimal(unitQuantity); } remain.UnitQuantity = lastRemainQuantity + inputQuantity - outputQuantity; lastRemainQuantity = remain.UnitQuantity; } return(result); }