Exemple #1
0
 /// <summary>
 /// Danner queryhandler til håndtering af forespørgelsen: BudgetkontoGetByRegnskabQuery.
 /// </summary>
 /// <param name="finansstyringRepository">Implementering af repository til finansstyring.</param>
 /// <param name="adresseRepository">Implementering af repository til adressekartotek.</param>
 /// <param name="fællesRepository">Implementering af repository til fælles elementer.</param>
 /// <param name="objectMapper">Implementering af objektmapper.</param>
 public BudgetkontoGetByRegnskabQueryHandler(IFinansstyringRepository finansstyringRepository, IAdresseRepository adresseRepository, IFællesRepository fællesRepository, IObjectMapper objectMapper)
 {
     if (finansstyringRepository == null)
     {
         throw new ArgumentNullException("finansstyringRepository");
     }
     if (adresseRepository == null)
     {
         throw new ArgumentNullException("adresseRepository");
     }
     if (fællesRepository == null)
     {
         throw new ArgumentNullException("fællesRepository");
     }
     if (objectMapper == null)
     {
         throw new ArgumentNullException("objectMapper");
     }
     _finansstyringRepository = finansstyringRepository;
     _adresseRepository       = adresseRepository;
     _fællesRepository        = fællesRepository;
     _objectMapper            = objectMapper;
 }
 /// <summary>
 /// Danner queryhandler til håndtering af forespørgelsen: AdresselisteGetAllQuery.
 /// </summary>
 /// <param name="adresseRepository">Implementering af repository til adressekartoteket.</param>
 /// <param name="finansstyringRepository">Implementering af repository til finansstyring.</param>
 /// <param name="fællesRepository">Implementering af repository til fælles elementer.</param>
 /// <param name="objectMapper">Implementering af objektmapper.</param>
 public AdresselisteGetAllQueryHandler(IAdresseRepository adresseRepository, IFinansstyringRepository finansstyringRepository, IObjectMapper objectMapper, IFællesRepository fællesRepository)
 {
     if (adresseRepository == null)
     {
         throw new ArgumentNullException("adresseRepository");
     }
     if (finansstyringRepository == null)
     {
         throw new ArgumentNullException("finansstyringRepository");
     }
     if (objectMapper == null)
     {
         throw new ArgumentNullException("objectMapper");
     }
     if (fællesRepository == null)
     {
         throw new ArgumentNullException("fællesRepository");
     }
     _adresseRepository       = adresseRepository;
     _finansstyringRepository = finansstyringRepository;
     _objectMapper            = objectMapper;
     _fællesRepository        = fællesRepository;
 }
Exemple #3
0
 /// <summary>
 /// Danner commandhandler til håndtering af kommandoen: BogføringslinjeAddCommand.
 /// </summary>
 /// <param name="finansstyringRepository">Implementering af repository til finansstyring.</param>
 /// <param name="adresseRepository">Implementering af repository til adressekartotek.</param>
 /// <param name="fællesRepository">Implementering af repository til fælles elementer.</param>
 /// <param name="objectMapper">Implementering af objectmapper.</param>
 public BogføringslinjeAddCommandHandler(IFinansstyringRepository finansstyringRepository, IAdresseRepository adresseRepository, IFællesRepository fællesRepository, IObjectMapper objectMapper)
 {
     if (finansstyringRepository == null)
     {
         throw new ArgumentNullException("finansstyringRepository");
     }
     if (adresseRepository == null)
     {
         throw new ArgumentNullException("adresseRepository");
     }
     if (fællesRepository == null)
     {
         throw new ArgumentNullException("fællesRepository");
     }
     if (objectMapper == null)
     {
         throw new ArgumentNullException("objectMapper");
     }
     _finansstyringRepository = finansstyringRepository;
     _adresseRepository       = adresseRepository;
     _fællesRepository        = fællesRepository;
     _objectMapper            = objectMapper;
 }
Exemple #4
0
        /// <summary>
        /// Henter alle nyheder til finansstyring.
        /// </summary>
        /// <param name="finansstyringRepository">Implementering af repository til finansstyring.</param>
        /// <returns>Nyheder til finansstyring.</returns>
        private static async Task <IEnumerable <INyhedModel> > FinansstyringsnyhederGetAsync(IFinansstyringRepository finansstyringRepository)
        {
            if (finansstyringRepository == null)
            {
                throw new ArgumentNullException(nameof(finansstyringRepository));
            }

            List <INyhedModel> nyheder = new List <INyhedModel>();

            try
            {
                DateTime statusDato = DateTime.Now;

                IFinansstyringKonfigurationRepository konfiguration = finansstyringRepository.Konfiguration;
                DateTime nyhederFromDate = statusDato.AddDays(konfiguration.DageForNyheder * -1);
                DateTime nyhederToDate   = statusDato;

                foreach (IRegnskabModel regnskab in await finansstyringRepository.RegnskabslisteGetAsync())
                {
                    nyheder.AddRange((await finansstyringRepository.BogføringslinjerGetAsync(regnskab.Nummer, statusDato, konfiguration.AntalBogføringslinjer)).Where(m => m.Nyhedsudgivelsestidspunkt.Date.CompareTo(nyhederFromDate.Date) >= 0 && m.Nyhedsudgivelsestidspunkt.Date.CompareTo(nyhederToDate.Date) <= 0).ToList());
                    nyheder.AddRange((await finansstyringRepository.DebitorlisteGetAsync(regnskab.Nummer, statusDato)).Where(m => m.Nyhedsudgivelsestidspunkt.Date.CompareTo(nyhederFromDate.Date) >= 0 && m.Nyhedsudgivelsestidspunkt.Date.CompareTo(nyhederToDate.Date) <= 0).ToList());
                    nyheder.AddRange((await finansstyringRepository.KreditorlisteGetAsync(regnskab.Nummer, statusDato)).Where(m => m.Nyhedsudgivelsestidspunkt.Date.CompareTo(nyhederFromDate.Date) >= 0 && m.Nyhedsudgivelsestidspunkt.Date.CompareTo(nyhederToDate.Date) <= 0).ToList());
                }
                return(nyheder);
            }
            catch (IntranetGuiOfflineRepositoryException)
            {
                throw;
            }
            catch (IntranetGuiRepositoryException)
            {
                return(nyheder);
            }
        }
Exemple #5
0
 /// <summary>
 /// Danner QueryHandler til håndtering af forespørgelsen: KreditorGetQuery.
 /// </summary>
 /// <param name="finansstyringRepository">Implementering af repository til finansstyring.</param>
 /// <param name="adresseRepository">Implementering af repository til adresser.</param>
 /// <param name="fællesRepository">Implementering af repository til fælles elementer i domænet.</param>
 /// <param name="objectMapper">Implementering af objectmapper.</param>
 public KreditorGetQueryHandler(IFinansstyringRepository finansstyringRepository, IAdresseRepository adresseRepository, IFællesRepository fællesRepository, IObjectMapper objectMapper)
     : base(finansstyringRepository, adresseRepository, fællesRepository, objectMapper)
 {
 }
Exemple #6
0
 /// <summary>
 /// Danner egen klasse til test af basisklasse for en QueryHandler til finansstyring.
 /// </summary>
 /// <param name="finansstyringRepository">Implementering af repository til finansstyring.</param>
 /// <param name="objectMapper">Implementering af objectmapper.</param>
 public MyFinansstyringQueryHandler(IFinansstyringRepository finansstyringRepository, IObjectMapper objectMapper)
     : base(finansstyringRepository, objectMapper)
 {
 }
 /// <summary>
 /// Danner egen klasse til test af basisklasse for en CommandHandler til regnskaber.
 /// </summary>
 /// <param name="finansstyringRepository">Implementering af repository til finansstyring.</param>
 /// <param name="adresseRepository">Implementering af repository til adresser.</param>
 /// <param name="fællesRepository">Implementering af repository til fælles elementer i domænet.</param>
 /// <param name="objectMapper">Implementering af objectmapper.</param>
 /// <param name="exceptionBuilder">Implementering af builderen, der kan bygge exceptions.</param>
 public MyCommandHandler(IFinansstyringRepository finansstyringRepository, IAdresseRepository adresseRepository, IFællesRepository fællesRepository, IObjectMapper objectMapper, IExceptionBuilder exceptionBuilder)
     : base(finansstyringRepository, adresseRepository, fællesRepository, objectMapper, exceptionBuilder)
 {
 }
Exemple #8
0
        /// <summary>
        /// Synchronize the locale accounting data for a given <see cref="IRegnskabModel"/> to the online accounting repository.
        /// </summary>
        /// <param name="accountingRepository">The <see cref="IFinansstyringRepository"/> for the online accounting repository.</param>
        /// <param name="localeDataStorage">The <see cref="ILocaleDataStorage"/> for storing locale data.</param>>
        /// <param name="syncDataDocument">The <see cref="XDocument"/> containing the locale accounting data.</param>
        /// <param name="accountingModel">The given <see cref="IRegnskabModel"/> on which to synchronize locale accounting data to the online repository.</param>
        /// <exception cref="ArgumentNullException">Thrown when <paramref name="accountingRepository"/>, <paramref name="localeDataStorage"/>, <paramref name="syncDataDocument"/> or <paramref name="accountingModel"/> is null.</exception>
        private static async Task SyncLocaleData(IFinansstyringRepository accountingRepository, ILocaleDataStorage localeDataStorage, XDocument syncDataDocument, IRegnskabModel accountingModel)
        {
            if (accountingRepository == null)
            {
                throw new ArgumentNullException(nameof(accountingRepository));
            }
            if (localeDataStorage == null)
            {
                throw new ArgumentNullException(nameof(localeDataStorage));
            }
            if (syncDataDocument == null)
            {
                throw new ArgumentNullException(nameof(syncDataDocument));
            }
            if (accountingModel == null)
            {
                throw new ArgumentNullException(nameof(accountingModel));
            }

            try
            {
                XElement rootElement       = syncDataDocument.Root;
                XElement accountingElement = rootElement?.Elements(XName.Get("Regnskab", rootElement.Name.NamespaceName)).SingleOrDefault(element => GetAttributeValue(element, "nummer") != null && string.Compare(GetAttributeValue(element, "nummer"), accountingModel.Nummer.ToString(CultureInfo.InvariantCulture), StringComparison.Ordinal) == 0);
                if (accountingElement == null)
                {
                    return;
                }

                XElement postingLineToSync;
                lock (SyncRoot)
                {
                    postingLineToSync = GetPostingLineToSync(rootElement, accountingElement);
                    if (postingLineToSync != null && _cancelRequested == false)
                    {
                        postingLineToSync.StorePendingPostingLineInDocument();
                        localeDataStorage.StoreSyncDocument(syncDataDocument);
                    }
                }
                while (postingLineToSync != null && _cancelRequested == false)
                {
                    DateTime postingDate          = DateTime.ParseExact(GetAttributeValue(postingLineToSync, "dato"), "yyyyMMdd", CultureInfo.InvariantCulture);
                    string   voucherNo            = GetAttributeValue(postingLineToSync, "bilag");
                    string   accountNumber        = GetAttributeValue(postingLineToSync, "kontonummer");
                    string   text                 = GetAttributeValue(postingLineToSync, "tekst");
                    string   budgetAccountNumber  = GetAttributeValue(postingLineToSync, "budgetkontonummer");
                    decimal  debit                = GetAttributeValue(postingLineToSync, "debit") == null ? 0M : decimal.Parse(GetAttributeValue(postingLineToSync, "debit"), NumberStyles.Any, CultureInfo.InvariantCulture);
                    decimal  credit               = GetAttributeValue(postingLineToSync, "kredit") == null ? 0M : decimal.Parse(GetAttributeValue(postingLineToSync, "kredit"), NumberStyles.Any, CultureInfo.InvariantCulture);
                    int      addressAccountNumber = GetAttributeValue(postingLineToSync, "adressekonto") == null ? 0 : int.Parse(GetAttributeValue(postingLineToSync, "adressekonto"), NumberStyles.Integer, CultureInfo.InvariantCulture);
                    await accountingRepository.BogførAsync(accountingModel.Nummer, postingDate, voucherNo, accountNumber, text, budgetAccountNumber, debit, credit, addressAccountNumber);

                    lock (SyncRoot)
                    {
                        postingLineToSync.Remove();
                        localeDataStorage.StoreSyncDocument(syncDataDocument);

                        postingLineToSync = GetPostingLineToSync(rootElement, accountingElement);
                        if (postingLineToSync != null && _cancelRequested == false)
                        {
                            postingLineToSync.StorePendingPostingLineInDocument();
                            localeDataStorage.StoreSyncDocument(syncDataDocument);
                        }
                    }
                }
            }
            catch (IntranetGuiOfflineRepositoryException)
            {
                // We are currently offline.
                // Don't rethrow the exception.
            }
        }
 /// <summary>
 /// Danner QueryHandler til håndtering af forespørgelsen: BudgetkontogrupperGetQuery.
 /// </summary>
 /// <param name="finansstyringRepository">Implementering af repository til finansstyring.</param>
 /// <param name="objectMapper">Implementering af objectmapper.</param>
 public BudgetkontogrupperGetQueryHandler(IFinansstyringRepository finansstyringRepository, IObjectMapper objectMapper)
     : base(finansstyringRepository, objectMapper)
 {
 }
 /// <summary>
 /// Dannere egen klasse til test af basisklasse for en CommandHandler til finansstyring.
 /// </summary>
 /// <param name="finansstyringRepository">Implementering af repository til finansstyring.</param>
 /// <param name="objectMapper">Implementering af objectmapper.</param>
 /// <param name="exceptionBuilder">Implementering af builderen, der kan bygge exceptions.</param>
 public MyCommandHandler(IFinansstyringRepository finansstyringRepository, IObjectMapper objectMapper, IExceptionBuilder exceptionBuilder)
     : base(finansstyringRepository, objectMapper, exceptionBuilder)
 {
 }
Exemple #11
0
 /// <summary>
 /// Danner en ViewModel indeholdende grundlæggende kontooplysninger.
 /// </summary>
 /// <param name="regnskabViewModel">ViewModel for regnskabet, som kontoen er tilknyttet.</param>
 /// <param name="kontoModel">Model indeholdende grundlæggende kontooplysninger.</param>
 /// <param name="kontogruppeViewModel">ViewModel for kontogruppen.</param>
 /// <param name="displayName">Navn for ViewModel, som kan benyttes til visning i brugergrænsefladen.</param>
 /// <param name="image">Billede, der illustrerer en kontoen.</param>
 /// <param name="finansstyringRepository">Implementering af repositoryet til finansstyring.</param>
 /// <param name="exceptionHandlerViewModel">Implementering af ViewModel for exceptionhandleren.</param>
 protected KontoViewModelBase(IRegnskabViewModel regnskabViewModel, TKontoModel kontoModel, TKontogruppeViewModel kontogruppeViewModel, string displayName, byte[] image, IFinansstyringRepository finansstyringRepository, IExceptionHandlerViewModel exceptionHandlerViewModel)
 {
     if (regnskabViewModel == null)
     {
         throw new ArgumentNullException("regnskabViewModel");
     }
     if (Equals(kontoModel, null))
     {
         throw new ArgumentNullException("kontoModel");
     }
     if (Equals(kontogruppeViewModel, null))
     {
         throw new ArgumentNullException("kontogruppeViewModel");
     }
     if (string.IsNullOrEmpty(displayName))
     {
         throw new ArgumentNullException("displayName");
     }
     if (image == null)
     {
         throw new ArgumentNullException("image");
     }
     if (finansstyringRepository == null)
     {
         throw new ArgumentNullException("finansstyringRepository");
     }
     if (exceptionHandlerViewModel == null)
     {
         throw new ArgumentNullException("exceptionHandlerViewModel");
     }
     _regnskabViewModel           = regnskabViewModel;
     _kontoModel                  = kontoModel;
     _kontoModel.PropertyChanged += PropertyChangedOnKontoModelEventHandler;
     _kontogruppeViewModel        = kontogruppeViewModel;
     _displayName                 = displayName;
     _image                     = image;
     _erRegistreret             = false;
     _finansstyringRepository   = finansstyringRepository;
     _exceptionHandlerViewModel = exceptionHandlerViewModel;
 }
Exemple #12
0
 /// <summary>
 /// Danner ViewModel for en adressekonto.
 /// </summary>
 /// <param name="regnskabViewModel">ViewModel for regnskabet, som adressekontoen skal være tilknyttet.</param>
 /// <param name="adressekontoModel">Model for adressekontoen.</param>
 /// <param name="displayName">Navn for ViewModel, som kan benyttes til visning i brugergrænsefladen.</param>
 /// <param name="image">Billede, der illustrerer en adressekontoen.</param>
 /// <param name="finansstyringRepository">Implementering af repository til finansstyring.</param>
 /// <param name="exceptionHandlerViewModel">Implementering af ViewModel for en exceptionhandler.</param>
 public AdressekontoViewModel(IRegnskabViewModel regnskabViewModel, IAdressekontoModel adressekontoModel, string displayName, byte[] image, IFinansstyringRepository finansstyringRepository, IExceptionHandlerViewModel exceptionHandlerViewModel)
 {
     if (regnskabViewModel == null)
     {
         throw new ArgumentNullException("regnskabViewModel");
     }
     if (adressekontoModel == null)
     {
         throw new ArgumentNullException("adressekontoModel");
     }
     if (string.IsNullOrEmpty(displayName))
     {
         throw new ArgumentNullException("displayName");
     }
     if (image == null)
     {
         throw new ArgumentNullException("image");
     }
     if (finansstyringRepository == null)
     {
         throw new ArgumentNullException("finansstyringRepository");
     }
     if (exceptionHandlerViewModel == null)
     {
         throw new ArgumentNullException("exceptionHandlerViewModel");
     }
     _regnskabViewModel = regnskabViewModel;
     _adressekontoModel = adressekontoModel;
     _adressekontoModel.PropertyChanged += PropertyChangedOnAdressekontoModelEventHandler;
     _displayName               = displayName;
     _image                     = image;
     _finansstyringRepository   = finansstyringRepository;
     _exceptionHandlerViewModel = exceptionHandlerViewModel;
 }
 /// <summary>
 /// Danner en kommando, der på et regnskab kan initerer en ny ViewModel til bogføring.
 /// </summary>
 /// <param name="finansstyringRepository">Implementering af repository til finansstyring.</param>
 /// <param name="exceptionHandlerViewModel">Implementering af ViewModel til exceptionhandleren.</param>
 public BogføringSetCommand(IFinansstyringRepository finansstyringRepository, IExceptionHandlerViewModel exceptionHandlerViewModel)
     : this(finansstyringRepository, exceptionHandlerViewModel, false)
 {
 }
Exemple #14
0
        /// <summary>
        /// Synkroniserer finansstyringsdata til og fra det lokale datalager.
        /// </summary>
        /// <param name="finansstyringRepository">Implementering af finansstyringsrepositoryet, hvorfra data skal synkroniseres til og fra det lokale datalager.</param>
        /// <param name="finansstyringKonfigurationRepository">Implementering af konfiguration til finansstyringsrepositoryet.</param>
        /// <param name="localeDataStorage">Implementering af det lokale datalager.</param>
        /// <param name="syncDataDocument">XML dokument indeholdende de synkroniserede data.</param>
        /// <param name="regnskabModel">Model for regnskabet, hvor data skal synkroniseres til og fra.</param>
        /// <param name="makeFullSync">Angivelse af, om der skal foretages en fuld synkronisering.</param>
        private static async Task SyncData(IFinansstyringRepository finansstyringRepository, IFinansstyringKonfigurationRepository finansstyringKonfigurationRepository, ILocaleDataStorage localeDataStorage, XDocument syncDataDocument, IRegnskabModel regnskabModel, bool makeFullSync)
        {
            if (finansstyringRepository == null)
            {
                throw new ArgumentNullException(nameof(finansstyringRepository));
            }
            if (finansstyringKonfigurationRepository == null)
            {
                throw new ArgumentNullException(nameof(finansstyringKonfigurationRepository));
            }
            if (localeDataStorage == null)
            {
                throw new ArgumentNullException(nameof(localeDataStorage));
            }
            if (syncDataDocument == null)
            {
                throw new ArgumentNullException(nameof(syncDataDocument));
            }
            if (regnskabModel == null)
            {
                throw new ArgumentNullException(nameof(regnskabModel));
            }

            try
            {
                // Synkronisér regnskabsdata fra det online finansstyringsrepository til det lokale datalager.
                DateTime currentDate = DateTime.Now;
                foreach (IKontoModel kontoModel in await finansstyringRepository.KontoplanGetAsync(regnskabModel.Nummer, currentDate))
                {
                    lock (SyncRoot)
                    {
                        kontoModel.StoreInDocument(syncDataDocument);
                    }
                }
                foreach (IBudgetkontoModel budgetkontoModel in await finansstyringRepository.BudgetkontoplanGetAsync(regnskabModel.Nummer, currentDate))
                {
                    lock (SyncRoot)
                    {
                        budgetkontoModel.StoreInDocument(syncDataDocument);
                    }
                }
                if (makeFullSync)
                {
                    DateTime historicStatusDate = currentDate.AddMonths(-2);
                    while (historicStatusDate.Year >= currentDate.AddYears(-1).Year)
                    {
                        historicStatusDate = new DateTime(historicStatusDate.Year, historicStatusDate.Month, DateTime.DaysInMonth(historicStatusDate.Year, historicStatusDate.Month), 23, 59, 59);
                        foreach (IBudgetkontoModel budgetkontoModel in await finansstyringRepository.BudgetkontoplanGetAsync(regnskabModel.Nummer, historicStatusDate))
                        {
                            lock (SyncRoot)
                            {
                                budgetkontoModel.StoreInDocument(syncDataDocument);
                            }
                        }
                        historicStatusDate = historicStatusDate.AddMonths(-2);
                    }
                }
                foreach (IAdressekontoModel adressekontoModel in await finansstyringRepository.AdressekontolisteGetAsync(regnskabModel.Nummer, currentDate))
                {
                    lock (SyncRoot)
                    {
                        adressekontoModel.StoreInDocument(syncDataDocument);
                    }
                }
                foreach (IBogføringslinjeModel bogføringslinjeModel in await finansstyringRepository.BogføringslinjerGetAsync(regnskabModel.Nummer, currentDate, finansstyringKonfigurationRepository.AntalBogføringslinjer))
                {
                    lock (SyncRoot)
                    {
                        bogføringslinjeModel.StoreInDocument(syncDataDocument, true);
                    }
                }
                lock (SyncRoot)
                {
                    localeDataStorage.StoreSyncDocument(syncDataDocument);
                }
            }
            catch (IntranetGuiOfflineRepositoryException)
            {
                // We are currently offline.
                // Don't rethrow the exception.
            }
        }
Exemple #15
0
 /// <summary>
 /// Danner kommando til genindlæsning af regnskabslisten.
 /// </summary>
 /// <param name="finansstyringRepository">Implementering af repository til finansstyring.</param>
 /// <param name="exceptionHandlerViewModel">Implementering af en ViewModel til en exceptionhandler.</param>
 public RegnskabslisteRefreshCommand(IFinansstyringRepository finansstyringRepository, IExceptionHandlerViewModel exceptionHandlerViewModel)
     : this(finansstyringRepository, exceptionHandlerViewModel, null)
 {
 }
Exemple #16
0
 /// <summary>
 /// Danner en ViewModel til en budgetkonto.
 /// </summary>
 /// <param name="regnskabViewModel">ViewModel for regnskabet, som budgetkontoen er tilknyttet.</param>
 /// <param name="budgetkontoModel">Model for budgetkontoen.</param>
 /// <param name="budgetkontogruppeViewModel">ViewModel for kontogruppen til budgetkontoen.</param>
 /// <param name="finansstyringRepository">Implementering af repositoryet til finansstyring.</param>
 /// <param name="exceptionHandlerViewModel">Implementering af ViewModel for exceptionhandleren.</param>
 public BudgetkontoViewModel(IRegnskabViewModel regnskabViewModel, IBudgetkontoModel budgetkontoModel, IBudgetkontogruppeViewModel budgetkontogruppeViewModel, IFinansstyringRepository finansstyringRepository, IExceptionHandlerViewModel exceptionHandlerViewModel)
     : base(regnskabViewModel, budgetkontoModel, budgetkontogruppeViewModel, Resource.GetText(Text.BudgetAccount), Resource.GetEmbeddedResource("Images.Budgetkonto.png"), finansstyringRepository, exceptionHandlerViewModel)
 {
 }
Exemple #17
0
        /// <summary>
        /// Synkroniserer finansstyringsdata til og fra det lokale datalager.
        /// </summary>
        /// <param name="finansstyringRepository">Implementering af finansstyringsrepositoryet, hvorfra data skal synkroniseres til og fra det lokale datalager.</param>
        /// <param name="finansstyringKonfigurationRepository">Implementering af konfiguration til finansstyringsrepositoryet.</param>
        /// <param name="localeDataStorage">Implementering af det lokale datalager.</param>
        private static async Task SyncData(IFinansstyringRepository finansstyringRepository, IFinansstyringKonfigurationRepository finansstyringKonfigurationRepository, ILocaleDataStorage localeDataStorage)
        {
            if (finansstyringRepository == null)
            {
                throw new ArgumentNullException(nameof(finansstyringRepository));
            }
            if (finansstyringKonfigurationRepository == null)
            {
                throw new ArgumentNullException(nameof(finansstyringKonfigurationRepository));
            }
            if (localeDataStorage == null)
            {
                throw new ArgumentNullException(nameof(localeDataStorage));
            }

            try
            {
                XDocument syncDataDocument = null;

                IEnumerable <IKontogruppeModel> kontogruppeliste = await finansstyringRepository.KontogruppelisteGetAsync();

                foreach (IKontogruppeModel kontogruppe in kontogruppeliste)
                {
                    lock (SyncRoot)
                    {
                        if (syncDataDocument == null)
                        {
                            localeDataStorage.StoreSyncData(kontogruppe);
                            syncDataDocument = localeDataStorage.GetLocaleData();
                        }
                        else
                        {
                            kontogruppe.StoreInDocument(syncDataDocument);
                        }
                    }
                }

                IEnumerable <IBudgetkontogruppeModel> budgetkontogruppeliste = await finansstyringRepository.BudgetkontogruppelisteGetAsync();

                foreach (IBudgetkontogruppeModel budgetkontogruppe in budgetkontogruppeliste)
                {
                    lock (SyncRoot)
                    {
                        if (syncDataDocument == null)
                        {
                            localeDataStorage.StoreSyncData(budgetkontogruppe);
                            syncDataDocument = localeDataStorage.GetLocaleData();
                        }
                        else
                        {
                            budgetkontogruppe.StoreInDocument(syncDataDocument);
                        }
                    }
                }

                bool makeFullSync = true;
                lock (SyncRoot)
                {
                    if (syncDataDocument != null)
                    {
                        DateTime?lastFullSync = syncDataDocument.GetSidsteFuldeSynkronisering();
                        makeFullSync = lastFullSync.HasValue == false || lastFullSync.Value.Date < DateTime.Now.AddDays(-30).Date;
                    }
                }

                IRegnskabModel[] regnskabsliste = (await finansstyringRepository.RegnskabslisteGetAsync()).ToArray();
                await SyncLocaleData(finansstyringRepository, localeDataStorage, syncDataDocument, regnskabsliste);

                if (_cancelRequested)
                {
                    return;
                }

                IList <Task> regnskabSyncTasks = new List <Task>();
                foreach (IRegnskabModel regnskab in regnskabsliste)
                {
                    lock (SyncRoot)
                    {
                        if (syncDataDocument == null)
                        {
                            localeDataStorage.StoreSyncData(regnskab);
                            syncDataDocument = localeDataStorage.GetLocaleData();
                        }
                        else
                        {
                            regnskab.StoreInDocument(syncDataDocument);
                        }
                    }
                    regnskabSyncTasks.Add(SyncData(finansstyringRepository, finansstyringKonfigurationRepository, localeDataStorage, syncDataDocument, regnskab, makeFullSync));
                }
                Task.WaitAll(regnskabSyncTasks.ToArray());

                lock (SyncRoot)
                {
                    if (syncDataDocument == null)
                    {
                        return;
                    }
                    if (makeFullSync)
                    {
                        syncDataDocument.StoreSidsteFuldeSynkroniseringInDocument(DateTime.Now);
                    }
                    localeDataStorage.StoreSyncDocument(syncDataDocument);
                }
            }
            catch (IntranetGuiOfflineRepositoryException)
            {
                // We are currently offline.
                // Don't rethrow the exception.
            }
        }