/// <summary> /// Gemmer data for et regnskab i det lokale datalager. /// </summary> /// <param name="regnskabModel">Model for et regnskab.</param> /// <param name="localeDataDocument">XML dokument, hvori data skal gemmes.</param> public static void StoreInDocument(this IRegnskabModel regnskabModel, XDocument localeDataDocument) { if (regnskabModel == null) { throw new ArgumentNullException("regnskabModel"); } if (localeDataDocument == null) { throw new ArgumentNullException("localeDataDocument"); } var regnskabElement = localeDataDocument.GetRegnskabElement(regnskabModel.Nummer); if (regnskabElement == null) { var rootElement = localeDataDocument.Root; regnskabElement = new XElement(XName.Get("Regnskab", rootElement.Name.NamespaceName)); regnskabElement.UpdateAttribute(XName.Get("nummer", string.Empty), regnskabModel.Nummer.ToString(CultureInfo.InvariantCulture)); regnskabElement.UpdateAttribute(XName.Get("navn", string.Empty), regnskabModel.Navn); rootElement.Add(regnskabElement); return; } regnskabElement.UpdateAttribute(XName.Get("navn", string.Empty), regnskabModel.Navn); }
/// <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. } }
/// <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. } }