Example #1
0
        /// <summary>
        /// Gets the email address of all leaders that have pending reports to be approved.
        /// </summary>
        /// <returns>List of email addresses.</returns>
        public IEnumerable <Report> GetLeadersWithPendingReportsMails()
        {
            var reports = reportRepo.AsQueryableLazy().Where(r => r.Status == ReportStatus.Pending).ToList();

            var reportsWithNoLeader = reports.Where(report => report.ResponsibleLeader == null);

            foreach (var report in reportsWithNoLeader)
            {
                logger.LogError(report.Person.FullName + "s indberetning har ingen leder. Indberetningen kan derfor ikke godkendes.");
            }

            return(reports.Where(report => report.ResponsibleLeaderId != null && !string.IsNullOrEmpty(report.ResponsibleLeader.Mail) && report.ResponsibleLeader.RecieveMail));
        }
        public void AddLeadersToReportsThatHaveNone()
        {
            var i       = 0;
            var reports = _reportRepo.AsQueryableLazy().Where(r =>
                                                              r.Status == ReportStatus.Pending &&
                                                              (r.ResponsibleLeader == null || !r.ResponsibleLeader.IsActive || r.ActualLeader == null || !r.ActualLeader.IsActive)).ToList();

            foreach (var report in reports)
            {
                i++;
                report.ResponsibleLeaderId = _reportService.GetResponsibleLeaderForReport(report).Id;
                report.ActualLeaderId      = _reportService.GetActualLeaderForReport(report).Id;
            }
            _reportRepo.DetectChanges();
            _reportRepo.Save();
        }
        public void AddLeadersToReportsThatHaveNone()
        {
            // Fail-safe as some reports for unknown reasons have not had a leader attached
            Console.WriteLine("Adding leaders to drive reports that have none");
            var reports = _reportRepo.AsQueryableLazy().Where(r => (r.PersonReports.Count == 0 || r.ActualLeader == null) && r.Status == ReportStatus.Pending).ToList();

            foreach (var report in reports)
            {
                report.UpdateResponsibleLeaders(_driveService.GetResponsibleLeadersForReport(report));
                var actualLeader = _driveService.GetActualLeaderForReport(report);
                if (actualLeader != null)
                {
                    report.ActualLeaderId = actualLeader.Id;
                }
            }
            _reportRepo.DetectChanges();
            _reportRepo.Save();
        }
        private void UpdateOrgUnits(IEnumerable <APIOrgUnit> apiOrgUnits)
        {
            // Handle inserts
            var toBeInserted = apiOrgUnits.Where(s => !_orgUnitRepo.AsNoTracking().Select(d => d.OrgId.ToString()).Contains(s.Id)).ToList();
            var toBeUpdated  = _orgUnitRepo.AsQueryableLazy().Where(d => apiOrgUnits.Select(s => s.Id).Contains(d.OrgId.ToString())).ToList();

            var insertTotal   = toBeInserted.Count();
            var insertCounter = 0;

            _logger.LogDebug("Orgunits to be inserted: {0}", insertTotal);
            foreach (var apiOrgUnit in toBeInserted)
            {
                if (++insertCounter % 10 == 0)
                {
                    _logger.LogDebug("Inserting orgunit {0} of {1}", insertCounter, insertTotal);
                }
                var orgToInsert = new OrgUnit();
                orgToInsert.HasAccessToFourKmRule     = false;
                orgToInsert.HasAccessToVacation       = false;
                orgToInsert.DefaultKilometerAllowance = KilometerAllowance.Calculated;
                mapAPIOrgUnit(apiOrgUnit, ref orgToInsert);
                if (orgToInsert.Address == null)
                {
                    _logger.LogWarning("Skipping orgunit insert because it has no address. OrgId: {0} Name: {1}", orgToInsert.OrgId, orgToInsert.LongDescription);
                    continue;
                }
                _orgUnitRepo.Insert(orgToInsert);
                // need to save each time to generate db id used in the next parent references
                _orgUnitRepo.Save();
            }

            // Handle updates
            var updateTotal   = toBeUpdated.Count();
            var updateCounter = 0;

            _logger.LogDebug("Orgunits to be updated: {0}", updateTotal);
            foreach (var orgUnit in toBeUpdated)
            {
                try
                {
                    if (++updateCounter % 10 == 0)
                    {
                        _logger.LogDebug("Updating orgunit {0} of {1}", updateCounter, updateTotal);
                    }
                    var apiOrgUnit  = apiOrgUnits.Where(s => s.Id == orgUnit.OrgId.ToString()).First();
                    var orgToUpdate = orgUnit;
                    mapAPIOrgUnit(apiOrgUnit, ref orgToUpdate);
                    if (orgToUpdate.Address == null)
                    {
                        _logger.LogWarning("Skipping orgunit update because it has no address. OrgId: {0} Name: {1}", orgToUpdate.OrgId, orgToUpdate.LongDescription);
                        continue;
                    }
                    _orgUnitRepo.Update(orgToUpdate);
                }
                catch (Exception e)
                {
                    _logger.LogError(e, "Failed to update Orgunit. OrgId: {0} Name: {1}", orgUnit.OrgId, orgUnit.LongDescription);
                }
            }
            _orgUnitRepo.DetectChanges();
            _orgUnitRepo.Save();
        }
        private void UpdatePersons(IEnumerable <APIPerson> apiPersons)
        {
            // Handle inserts
            var toBeInserted = apiPersons.Where(s => !_personRepo.AsNoTracking().Select(d => d.CprNumber).Contains(s.CPR));
            var toBeUpdated  = _personRepo.AsQueryableLazy().Where(d => apiPersons.Select(s => s.CPR).Contains(d.CprNumber)).ToList();
            var toBeDeleted  = _personRepo.AsQueryableLazy().Where(p => p.IsActive && !apiPersons.Select(ap => ap.CPR).Contains(p.CprNumber)).ToList();

            var insertTotal   = toBeInserted.Count();
            var insertCounter = 0;

            _logger.LogDebug("Persons to be inserted: {0}", insertTotal);
            foreach (var apiPerson in toBeInserted)
            {
                if (++insertCounter % 10 == 0)
                {
                    _logger.LogDebug("Inserting person {0} of {1}", insertCounter, insertTotal);
                }
                var personToInsert = new Person();
                personToInsert.IsAdmin           = false;
                personToInsert.RecieveMail       = true;
                personToInsert.Employments       = new List <Employment>();
                personToInsert.PersonalAddresses = new List <PersonalAddress>();
                mapAPIPerson(apiPerson, ref personToInsert);
                _personRepo.Insert(personToInsert);
                _personRepo.Save();
                //UpdateHomeAddress(apiPerson, ref personToInsert);
                UpdateVacationBalances(apiPerson, ref personToInsert);
            }
            _personRepo.Save();

            // Handle updates
            var updateTotal   = toBeUpdated.Count();
            var updateCounter = 0;

            _logger.LogDebug("Persons to be updated: {0}", updateTotal);
            foreach (var person in toBeUpdated)
            {
                try
                {
                    if (++updateCounter % 10 == 0)
                    {
                        _logger.LogDebug("Updating person {0} of {1}", updateCounter, updateTotal);
                    }
                    var apiPerson      = apiPersons.Where(s => s.CPR == person.CprNumber).First();
                    var personToUpdate = person;
                    mapAPIPerson(apiPerson, ref personToUpdate);
                    //UpdateHomeAddress(apiPerson, ref personToUpdate);
                    UpdateVacationBalances(apiPerson, ref personToUpdate);
                    _personRepo.Update(personToUpdate);
                }
                catch (Exception e)
                {
                    _logger.LogError(e, "Failed to update Person. Name: {0}", person.FullName);
                }
            }

            // Handle deletes
            var deleteTotal   = toBeDeleted.Count();
            var deleteCounter = 0;

            _logger.LogDebug("Persons to be inactivated: {0}", deleteTotal);
            foreach (var personToBeDeleted in toBeDeleted)
            {
                if (++deleteCounter % 10 == 0)
                {
                    _logger.LogDebug("Inactivating person {0} of {1}", deleteCounter, deleteTotal);
                }
                personToBeDeleted.IsActive = false;
                foreach (var employment in personToBeDeleted.Employments)
                {
                    if (employment.EndDateTimestamp == 0 || employment.EndDateTimestamp > GetUnixTime(DateTime.Now.Date))
                    {
                        employment.EndDateTimestamp = GetUnixTime(DateTime.Now.Date);
                    }
                }
                _personRepo.Update(personToBeDeleted);
            }
            _personRepo.DetectChanges();
            _personRepo.Save();
        }