Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        /// <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);
        }