public static BusinessDaysCalculator Load(string filename)
        {
            BusinessDaysCalculator loaded = null;

            if (File.Exists(filename))
            {
                using (FileStream fs = new FileStream(filename, FileMode.Open))
                {
                    XmlSerializer xser = new XmlSerializer(typeof(BusinessDaysCalculator));
                    loaded = (BusinessDaysCalculator)xser.Deserialize(fs);
                    fs.Close();
                }
            }
            else
            {
                loaded = new BusinessDaysCalculator();
            }

            return(loaded);
        }
 private void LoadAll()
 {
     CurrentOptions = Options.Load("config.xml");
     GlobalBusinessDaysCalculator = BusinessDaysCalculator.Load("business.xml");
     GlobalAddressBook            = AddressBook.LoadXML("addresses.xml");
 }
Exemple #3
0
        private NextTripTicket GenerateTimeAndDate(List <POI> poi)
        {
            int i = 1;

            NextTripTicket ntt = null;

            BusinessDaysCalculator businessDays = MainWindow.Instance.GlobalBusinessDaysCalculator;

            // Стартовая дата в чеке
            DateTime startTime = receiptDate;

            //Определяем конец рабочего дня (попросту добавляем к указанной дате время)
            DateTime endDT = new DateTime(startTime.Year, startTime.Month, startTime.Day, endOfWorkDay.Hours, endOfWorkDay.Minutes, 0);

            foreach (POI p in poi)
            {
                if (i > 1)
                {
                    startTime = startTime.AddMinutes(p.prev.toNextPOI.TotalMinutes);
                }
                if (p.next == null)
                {
                    break;
                }

                //ПРЕДСТАВЛЕНИЕ ДАТЫ
                //Конвертация даты в строку и запись в объект. (Можно делать это уже при выгрузки в XLSX
                p.Date     = startTime.ToShortDateString();
                p.FullDate = startTime;

                startTime = startTime.AddMinutes(random.Next(0, pause + 1)); //Добавляем задержку в точке назначения

                p.timeDeparture = startTime;
                p.timeArrive    = startTime.Add(p.toNextPOI);

                //Проверяем укладываемся ли в рабочий день
                if (p.next != null)
                {
                    //Если ехать в следующую точку, то надо проверить а хватит ли потом времени в рамках рабочего дня

                    if ((startTime.AddMinutes(p.next.toNextPOI.TotalMinutes * 2) > endDT) && !p.address.IsBase)
                    {
                        DateTime checkDay;
                        //Если не хватит то переключаем день на следующий
                        do
                        { //Меняем день до тех пор пока он не станет следующим РАБОЧИМ днем
                            startTime = startTime.AddDays(1);
                            checkDay  = new DateTime(startTime.Year, startTime.Month, startTime.Day);
                        } while (((startTime.DayOfWeek == DayOfWeek.Saturday || startTime.DayOfWeek == DayOfWeek.Sunday) && (businessDays.IsBusinessDay(checkDay) != 1)) || // если это выходной и не является принудительно рабочим
                                 businessDays.IsBusinessDay(checkDay) == 2);                                                                                                // если это любой другой день, но он объявлен нерабочим

                        //Переводим стартовое время на начало рабочего дня
                        startTime = new DateTime(startTime.Year, startTime.Month, startTime.Day, startOfWorkDay.Hours, startOfWorkDay.Minutes, 0);
                        //Определяем конец рабочего дня
                        endDT = new DateTime(startTime.Year, startTime.Month, startTime.Day, endOfWorkDay.Hours, endOfWorkDay.Minutes, 0);
                        //startTime = startOfWorkDay;

                        FuelResidude = Math.Round(p.FuelResidude);
                        // Если нужно создавать новый трип лист каждый раз когда закончился день
                        // и еще достаточно топлива, то
                        if (MainWindow.DIVIDE_TRIPTICKETS && FuelResidude > fuelLost)
                        {
                            // Записываем данные для переноса на след день
                            ntt = new NextTripTicket()
                            {
                                NextIndex = Id + 1,         // Id следующего путевого листа
                                Date      = startTime,      //Дата с которой начнется след лист
                                Liters    = p.FuelResidude, //Остаток топлива с которым начнется день
                                NumberPOI = i               //Количество уже пройденных точек (нужно для удаление лишних)
                            };

                            return(ntt);
                        }

                        i = 0;
                    }
                    i++;
                }
            }

            return(null);
        }