private static DataServiceQuery <Employee1CRecord> GetEmployeesQuery(EnterpriseV8 client)
 {
     return((DataServiceQuery <Employee1CRecord>)client.Catalog_Сотрудники
            .Select(x => new Employee1CRecord()
     {
         EmployeeKey = x.Ref_Key,
         PersonKey = x.ФизическоеЛицо_Key.Value
     }));
 }
 private static DataServiceQuery <UsedVacation1CRecord> GetUsedVacationsQuery(EnterpriseV8 client)
 {
     return((DataServiceQuery <UsedVacation1CRecord>)client.AccumulationRegister_ФактическиеОтпуска_RecordType
            .Select(x => new UsedVacation1CRecord()
     {
         DaysUsed = x.Количество,
         EmployeeKey = x.Сотрудник_Key.Value
     }));
 }
 private static DataServiceQuery <Person1CRecord> GetPersonsQuery(EnterpriseV8 client)
 {
     return((DataServiceQuery <Person1CRecord>)client.Catalog_ФизическиеЛица
            .Select(x => new Person1CRecord()
     {
         Birthday = x.ДатаРождения.Value,
         PersonKey = x.Ref_Key,
         NameRus = x.Description
     }));
 }
        private async Task <List <VacationInfo1C> > Get1CInformation()
        {
            var uriBuilder = new UriBuilder(this.bkConfiguration.Url);
            var client     = new EnterpriseV8(uriBuilder.Uri);

            client.Credentials = new NetworkCredential()
            {
                UserName = this.bkConfiguration.Username, Password = this.bkConfiguration.Password
            };

            var taskFactory = new TaskFactory();

            var personsQuery   = GetPersonsQuery(client);
            var employeesQuery = GetEmployeesQuery(client);
            var vacQuery       = GetEarnedVacationsQuery(client);
            var vacUsedQuery   = GetUsedVacationsQuery(client);

            var persons = await taskFactory.FromAsync(personsQuery.BeginExecute, personsQuery.EndExecute, new object());

            var employees = await taskFactory.FromAsync(employeesQuery.BeginExecute, employeesQuery.EndExecute, new object());

            var allEarnedVacations = await taskFactory.FromAsync(vacQuery.BeginExecute, vacQuery.EndExecute, new object());

            var vacationsUsed = await taskFactory.FromAsync(vacUsedQuery.BeginExecute, vacUsedQuery.EndExecute, new object());

            var currentDate = DateTime.UtcNow.Date;

            var records = persons
                          .Join(employees, x => x.PersonKey, x => x.PersonKey, (p, e) => new
            {
                p.NameRus,
                e.EmployeeKey,
                p.Birthday
            })
                          .GroupJoin(allEarnedVacations, x => x.EmployeeKey, x => x.EmployeeKey, (p, v) => new
            {
                p.EmployeeKey,
                p.Birthday,
                p.NameRus,
                VacationRights = v
                                 .Where(x => x.Period <= currentDate)
                                 .DefaultIfEmpty(new EarnedVacation1CRecord())
                                 .Aggregate((i, j) => i.Period > j.Period ? i : j)
                                 .DaysEarned ?? 0
            })
                          .GroupJoin(vacationsUsed, x => x.EmployeeKey, x => x.EmployeeKey, (p, v) => new
            {
                p.Birthday,
                p.NameRus,
                DaysLeft = p.VacationRights - v.Sum(x => x.DaysUsed ?? 0)
            })
                          .Select(x => new VacationInfo1C()
            {
                NameRus  = x.NameRus,
                BirthDay = x.Birthday,
                DaysLeft = x.DaysLeft
            })
                          .ToList();

            return(records);
        }
 private static DataServiceQuery <EarnedVacation1CRecord> GetEarnedVacationsQuery(EnterpriseV8 client)
 {
     return((DataServiceQuery <EarnedVacation1CRecord>)client.InformationRegister_ЗаработанныеПраваНаОтпуска
            .Where(x => x.КоличествоДней > 0)
            .Select(x => new EarnedVacation1CRecord()
     {
         DaysEarned = x.КоличествоДней,
         EmployeeKey = x.Сотрудник_Key,
         Period = x.Period
     }));
 }