From 7f37601b33003a246e6148113c4257fce2bfd70e Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Fri, 21 May 2021 07:12:37 +0200 Subject: [PATCH 01/58] multiple fixes for importing cost centre hierarchy. disable ILT for the moment, to avoid confusion. fixes #294 --- csharp/ICT/Common/DB/MySQL.cs | 3 +- .../Server/lib/MFinance/setup/GL.Setup.cs | 142 +++++++----------- .../Server/sql/DefaultCostCentreHierarchy.yml | 1 - csharp/ICT/Petra/Shared/Constants.cs | 5 +- .../forms/Finance/Setup/GL/CostCenterTree.js | 5 +- 5 files changed, 64 insertions(+), 92 deletions(-) diff --git a/csharp/ICT/Common/DB/MySQL.cs b/csharp/ICT/Common/DB/MySQL.cs index a02041305a..2273a5a640 100644 --- a/csharp/ICT/Common/DB/MySQL.cs +++ b/csharp/ICT/Common/DB/MySQL.cs @@ -4,7 +4,7 @@ // @Authors: // timop // -// Copyright 2004-2020 by OM International +// Copyright 2004-2021 by OM International // // This file is part of OpenPetra.org. // @@ -163,6 +163,7 @@ public String FormatQueryRDBMSSpecific(String ASqlQuery) ReturnValue = ReturnValue.Replace("true AS ", "1 AS "); ReturnValue = ReturnValue.Replace("false AS ", "0 AS "); ReturnValue = ReturnValue.Replace("SUM (", "SUM("); + ReturnValue = ReturnValue.Replace("COUNT (", "COUNT("); if (ReturnValue.Contains(" AS usage")) { diff --git a/csharp/ICT/Petra/Server/lib/MFinance/setup/GL.Setup.cs b/csharp/ICT/Petra/Server/lib/MFinance/setup/GL.Setup.cs index c04f808887..dc92b0330f 100644 --- a/csharp/ICT/Petra/Server/lib/MFinance/setup/GL.Setup.cs +++ b/csharp/ICT/Petra/Server/lib/MFinance/setup/GL.Setup.cs @@ -3374,13 +3374,15 @@ public static bool ImportAccountHierarchy(Int32 ALedgerNumber, string AHierarchy return SaveGLSetupTDS(ALedgerNumber, ref MainDS, out AVerificationResult) == TSubmitChangesResult.scrOK; } - private static void CreateCostCentresRecursively(ref GLSetupTDS AMainDS, + private static bool CreateCostCentresRecursively(ref GLSetupTDS AMainDS, Int32 ALedgerNumber, ref StringCollection AImportedCostCentreCodes, XmlNode ACurrentNode, - string AParentCostCentreCode) + string AParentCostCentreCode, + out TVerificationResultCollection AVerificationResult) { ACostCentreRow newCostCentre = null; + AVerificationResult = new TVerificationResultCollection(); string CostCentreCode = TYml2Xml.GetElementName(ACurrentNode).ToUpper(); @@ -3394,6 +3396,12 @@ public static bool ImportAccountHierarchy(Int32 ALedgerNumber, string AHierarchy { newCostCentre = (ACostCentreRow)existingCostCentre; } + else if ((AParentCostCentreCode == null) && (AMainDS.ACostCentre.Rows.Count > 0)) + { + AVerificationResult.Add(new TVerificationResult("Import CostCentres", + "Root Cost Centre " + CostCentreCode + " does not match existing cost centre", TResultSeverity.Resv_Critical)); + return false; + } else { newRow = true; @@ -3420,8 +3428,13 @@ public static bool ImportAccountHierarchy(Int32 ALedgerNumber, string AHierarchy foreach (XmlNode child in ACurrentNode.ChildNodes) { - CreateCostCentresRecursively(ref AMainDS, ALedgerNumber, ref AImportedCostCentreCodes, child, newCostCentre.CostCentreCode); + if (!CreateCostCentresRecursively(ref AMainDS, ALedgerNumber, ref AImportedCostCentreCodes, child, newCostCentre.CostCentreCode, out AVerificationResult)) + { + return false; + } } + + return true; } /// @@ -3449,12 +3462,11 @@ public static bool ImportCostCentreHierarchy(Int32 ALedgerNumber, string AYmlHie catch (XmlException exp) { TLogging.Log(exp.ToString()); - throw new Exception( + VerificationResult.Add(new TVerificationResult("Import CostCentres", Catalog.GetString("There was a problem with the syntax of the file.") + Environment.NewLine + - exp.Message + - Environment.NewLine + - AYmlHierarchy); + exp.Message, TResultSeverity.Resv_Critical)); + return false; } } @@ -3463,15 +3475,17 @@ public static bool ImportCostCentreHierarchy(Int32 ALedgerNumber, string AYmlHie StringCollection ImportedCostCentreNames = new StringCollection(); - CreateCostCentresRecursively(ref MainDS, ALedgerNumber, ref ImportedCostCentreNames, root, null); + if (!CreateCostCentresRecursively(ref MainDS, ALedgerNumber, ref ImportedCostCentreNames, root, null, out VerificationResult)) + { + return false; + } foreach (ACostCentreRow costCentreRow in MainDS.ACostCentre.Rows) { if ((costCentreRow.RowState != DataRowState.Deleted) && !ImportedCostCentreNames.Contains(costCentreRow.CostCentreCode)) { - // TODO: delete costcentres that don't exist anymore in the new hierarchy, or deactivate them? + // delete costcentres that don't exist anymore in the new hierarchy. // (check if their balance is empty and no transactions exist, or catch database constraint violation) - // TODO: what about system cost centres? probably alright to ignore here bool CanBeParent; bool CanDelete; String ErrorMsg; @@ -3481,26 +3495,13 @@ public static bool ImportCostCentreHierarchy(Int32 ALedgerNumber, string AYmlHie out CanDelete, out ErrorMsg); -#if DISABLED - // TODO check if we can overrule and delete eg. ILT cost centres. - // see https://github.com/openpetra/openpetra/issues/120 - if (false && !CanDelete) - { - ErrorMsg = String.Format(Catalog.GetString("Unable to delete Cost Centre {0}"), costCentreRow.CostCentreCode) + - "\r\n" + - ErrorMsg; - VerificationResult.Add(new TVerificationResult(Catalog.GetString("Import hierarchy"), ErrorMsg, TResultSeverity.Resv_Critical)); - return false; - } -#endif - if (!CanDelete) { + TLogging.Log("cannot delete " + costCentreRow.CostCentreCode + " " + ErrorMsg); costCentreRow.CostCentreActiveFlag = false; } else { - // TODO: need to delete "a_valid_ledger_number" as well if it exists costCentreRow.Delete(); } } @@ -3509,38 +3510,6 @@ public static bool ImportCostCentreHierarchy(Int32 ALedgerNumber, string AYmlHie return SaveGLSetupTDS(ALedgerNumber, ref MainDS, out VerificationResult) == TSubmitChangesResult.scrOK; } - /// - /// import basic data for new ledger - /// - [RequireModulePermission("FINANCE-3")] - public static bool ImportNewLedger(Int32 ALedgerNumber, - string AXmlLedgerDetails, - string AXmlAccountHierarchy, - string AXmlCostCentreHierarchy, - string AXmlMotivationDetails - ) - { - // TODO ImportNewLedger - - // if this ledger already exists, delete all tables first? - // Or try to reuse existing balances etc? - - // first create/modify ledger - // set ForexGainsLossesAccount; there is no foreign key, so no problem - - // create the calendar for the ledger, automatically calculating the dates of the forwarding periods - - // create the partner with special type LEDGER from the ledger number, with 6 trailing zeros - - // create/modify accounts (might need to drop motivation details) - - // create/modify costcentres (might need to drop motivation details) - - // create/modify motivation details - - return false; - } - /// import a new Account hierarchy into an empty new ledger private static void ImportDefaultAccountHierarchy(ref GLSetupTDS AMainDS, Int32 ALedgerNumber, ref TVerificationResultCollection AVerificationResult) { @@ -3615,7 +3584,8 @@ private static void ImportDefaultCostCentreHierarchy(ref GLSetupTDS AMainDS, Int StringCollection ImportedCostCentreNames = new StringCollection(); - CreateCostCentresRecursively(ref AMainDS, ALedgerNumber, ref ImportedCostCentreNames, root, null); + TVerificationResultCollection VerificationResult; + CreateCostCentresRecursively(ref AMainDS, ALedgerNumber, ref ImportedCostCentreNames, root, null, out VerificationResult); } private static void SetupILTCostCentreHierarchy(ref GLSetupTDS AMainDS, Int32 ALedgerNumber, TDBTransaction ATransaction) @@ -4486,16 +4456,25 @@ public static bool GetCurrencyCodes(out ACurrencyTable AResultTable) ImportDefaultAccountHierarchy(ref MainDS, ANewLedgerNumber, ref AVerificationResult); ImportDefaultCostCentreHierarchy(ref MainDS, ANewLedgerNumber, ALedgerName); - if (MainDS.ACostCentre.Rows.Find(new object[] { ANewLedgerNumber, "ILT" }) != null) + TSystemDefaults SystemDefaults = new TSystemDefaults(db); + if (SystemDefaults.GetBooleanDefault( + SharedConstants.SYSDEFAULT_ILTPROCESSINGENABLED, false) == true) { + ACostCentreRow newCostCentreRow = MainDS.ACostCentre.NewRowTyped(); + newCostCentreRow.LedgerNumber = ANewLedgerNumber; + newCostCentreRow.CostCentreCode = "ILT"; + newCostCentreRow.CostCentreToReportTo = "[" + ANewLedgerNumber.ToString() + "]"; + newCostCentreRow.CostCentreName = "Inter Ledger Transfer Total"; + newCostCentreRow.PostingCostCentreFlag = false; + newCostCentreRow.CostCentreActiveFlag = true; + MainDS.ACostCentre.Rows.Add(newCostCentreRow); + SetupILTCostCentreHierarchy(ref MainDS, ANewLedgerNumber, Transaction); } ImportDefaultMotivations(ref MainDS, ANewLedgerNumber, db); ImportDefaultAdminGrantsPayableReceivable(ref MainDS, ANewLedgerNumber); - // TODO: modify UI navigation yml file etc? - // TODO: permissions for which users? GLSetupTDSAccess.SubmitChanges(MainDS, db); // activate gift processing subsystem @@ -5667,16 +5646,19 @@ private static bool CostCentreHasChildren(Int32 ALedgerNumber, string ACostCentr ACostCentreRow CostCentreRow = tempTbl[0]; - // - // OM - specific code ahead! - // Don't allow any cost centres to be added to ILT or its children. - if ((CostCentreRow.CostCentreCode == MFinanceConstants.INTER_LEDGER_HEADING) - || (CostCentreRow.CostCentreToReportTo == MFinanceConstants.INTER_LEDGER_HEADING)) + TSystemDefaults SystemDefaults = new TSystemDefaults(db); + if (SystemDefaults.GetBooleanDefault( + SharedConstants.SYSDEFAULT_ILTPROCESSINGENABLED, false) == true) { - CanBeParent = false; - CanDelete = false; - Msg = Catalog.GetString("Cost Centres in ILT cannot have children."); - return; + // Don't allow any cost centres to be added to ILT or its children. + if ((CostCentreRow.CostCentreCode == MFinanceConstants.INTER_LEDGER_HEADING) + || (CostCentreRow.CostCentreToReportTo == MFinanceConstants.INTER_LEDGER_HEADING)) + { + CanBeParent = false; + CanDelete = false; + Msg = Catalog.GetString("Cost Centres in ILT cannot have children."); + return; + } } bool isParent = CostCentreHasChildren(ALedgerNumber, ACostCentreCode, Transaction); @@ -5692,26 +5674,12 @@ private static bool CostCentreHasChildren(Int32 ALedgerNumber, string ACostCentr CanDelete = true; } - if (CanBeParent || CanDelete) // I need to check whether the Cost Centre has been linked to a partner. - { // If it has, the link must be deleted first. - AValidLedgerNumberTable vlnTbl = AValidLedgerNumberAccess.LoadViaACostCentre(ALedgerNumber, ACostCentreCode, Transaction); - - if (vlnTbl.Rows.Count > 0) // There's a link to a partner! - { - CanBeParent = false; - CanDelete = false; - Msg = String.Format(Catalog.GetString("Cost Centre is linked to partner {0}."), - vlnTbl[0].PartnerKey); - } - } - if (!CanBeParent || CanDelete) { - List cascadingReferences; - Int32 refs = MCommon.Data.Cascading.ACostCentreCascading.CountByPrimaryKey( - ALedgerNumber, ACostCentreCode, - 5, Transaction, true, - out cascadingReferences); + string sql = "SELECT COUNT(*) FROM PUB_a_transaction " + + "WHERE a_ledger_number_i = " + ALedgerNumber.ToString() + " " + + "AND a_cost_centre_code_c = '" + ACostCentreCode + "'"; + Int32 refs = Convert.ToInt32(db.ExecuteScalar(sql, Transaction)); bool isInUse = (refs > 0); diff --git a/csharp/ICT/Petra/Server/sql/DefaultCostCentreHierarchy.yml b/csharp/ICT/Petra/Server/sql/DefaultCostCentreHierarchy.yml index d361ff5de1..5d1db327b7 100644 --- a/csharp/ICT/Petra/Server/sql/DefaultCostCentreHierarchy.yml +++ b/csharp/ICT/Petra/Server/sql/DefaultCostCentreHierarchy.yml @@ -2,4 +2,3 @@ [{#LEDGERNUMBER}]:{descr="[{#LEDGERNAME}]", active=True, type=Local} {#LEDGERNUMBERWITHLEADINGZEROS}00S:{descr="{#LEDGERNAME}"} {#LEDGERNUMBERWITHLEADINGZEROS}00:{descr="{#LEDGERNAME}, General"} - ILT:{descr="Inter Ledger Transfer Total"} \ No newline at end of file diff --git a/csharp/ICT/Petra/Shared/Constants.cs b/csharp/ICT/Petra/Shared/Constants.cs index 8c2f3ea196..64f245ee3f 100644 --- a/csharp/ICT/Petra/Shared/Constants.cs +++ b/csharp/ICT/Petra/Shared/Constants.cs @@ -4,7 +4,7 @@ // @Authors: // christiank, timop // -// Copyright 2004-2019 by OM International +// Copyright 2004-2021 by OM International // // This file is part of OpenPetra.org. // @@ -220,6 +220,9 @@ public static class SharedConstants /// System Defaults public const String SYSDEFAULT_SELFSIGNUPENABLED = "SelfSignUpEnabled"; + /// System Defaults + public const String SYSDEFAULT_ILTPROCESSINGENABLED = "ILTProcessingEnabled"; + /// System Defaults public const String SYSDEFAULT_EXWORKERSPECIALTYPE = "EXWORKERSPECIALTYPE"; diff --git a/js-client/src/forms/Finance/Setup/GL/CostCenterTree.js b/js-client/src/forms/Finance/Setup/GL/CostCenterTree.js index 330f841828..75a0afcd7c 100644 --- a/js-client/src/forms/Finance/Setup/GL/CostCenterTree.js +++ b/js-client/src/forms/Finance/Setup/GL/CostCenterTree.js @@ -1,10 +1,11 @@ // DO NOT REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. // // @Authors: -// Timotheus Pokorra +// Timotheus Pokorra // Christopher Jäkel // // Copyright 2017-2018 by TBits.net +// Copyright 2020-2021 by SolidCharity.com // // This file is part of OpenPetra. // @@ -65,7 +66,7 @@ function import_file(file_field) { display_message(i18next.t('CostCenterTree.uploadsuccess'), "success"); LoadTree(); } else { - display_error(parsed.AVerificationResult); + display_error(parsed.VerificationResult); } } }) From cb80bb942ae19b07f59236b36fbfbd6a47821a05 Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Fri, 21 May 2021 07:39:18 +0200 Subject: [PATCH 02/58] use constant for ILT --- csharp/ICT/Petra/Server/lib/MFinance/setup/GL.Setup.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/csharp/ICT/Petra/Server/lib/MFinance/setup/GL.Setup.cs b/csharp/ICT/Petra/Server/lib/MFinance/setup/GL.Setup.cs index dc92b0330f..f3146df027 100644 --- a/csharp/ICT/Petra/Server/lib/MFinance/setup/GL.Setup.cs +++ b/csharp/ICT/Petra/Server/lib/MFinance/setup/GL.Setup.cs @@ -3617,7 +3617,7 @@ private static void SetupILTCostCentreHierarchy(ref GLSetupTDS AMainDS, Int32 AL ccRow.LedgerNumber = ALedgerNumber; ccRow.CostCentreCode = costCentreCode; ccRow.CostCentreName = Convert.ToString(row[1]); - ccRow.CostCentreToReportTo = "ILT"; + ccRow.CostCentreToReportTo = MFinanceConstants.INTER_LEDGER_HEADING; ccRow.CostCentreType = "Foreign"; ccRow.SystemCostCentreFlag = true; AMainDS.ACostCentre.Rows.Add(ccRow); @@ -4462,7 +4462,7 @@ public static bool GetCurrencyCodes(out ACurrencyTable AResultTable) { ACostCentreRow newCostCentreRow = MainDS.ACostCentre.NewRowTyped(); newCostCentreRow.LedgerNumber = ANewLedgerNumber; - newCostCentreRow.CostCentreCode = "ILT"; + newCostCentreRow.CostCentreCode = MFinanceConstants.INTER_LEDGER_HEADING; newCostCentreRow.CostCentreToReportTo = "[" + ANewLedgerNumber.ToString() + "]"; newCostCentreRow.CostCentreName = "Inter Ledger Transfer Total"; newCostCentreRow.PostingCostCentreFlag = false; From 627af8b23d875d4a347ad2e516e4099bd5913d04 Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Fri, 21 May 2021 08:56:18 +0200 Subject: [PATCH 03/58] fix unit test, need ILT cost centres --- csharp/ICT/Petra/Server/lib/MFinance/setup/GL.Setup.cs | 9 ++++++++- .../Petra/Tools/SampleDataConstructor/GenerateLedger.cs | 2 +- .../lib/MFinance/server/GL/Test.GL.PeriodEnd.Month.cs | 5 +++-- .../ICT/Testing/lib/NUnitTools/CommonNUnitFunctions.cs | 5 +++-- 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/csharp/ICT/Petra/Server/lib/MFinance/setup/GL.Setup.cs b/csharp/ICT/Petra/Server/lib/MFinance/setup/GL.Setup.cs index f3146df027..df1b0bad56 100644 --- a/csharp/ICT/Petra/Server/lib/MFinance/setup/GL.Setup.cs +++ b/csharp/ICT/Petra/Server/lib/MFinance/setup/GL.Setup.cs @@ -4235,6 +4235,7 @@ public static bool GetCurrencyCodes(out ACurrencyTable AResultTable) Int32 ANumberOfAccountingPeriods, Int32 ACurrentPeriod, Int32 ANumberFwdPostingPeriods, + bool AWithILT, out TVerificationResultCollection AVerificationResult) { bool AActivateAccountsPayable = false; @@ -4453,10 +4454,16 @@ public static bool GetCurrencyCodes(out ACurrencyTable AResultTable) costCentreTypesRow.Deletable = false; MainDS.ACostCentreTypes.Rows.Add(costCentreTypesRow); + TSystemDefaults SystemDefaults = new TSystemDefaults(db); + + if (AWithILT) + { + SystemDefaults.SetSystemDefault(SharedConstants.SYSDEFAULT_ILTPROCESSINGENABLED, Boolean.TrueString); + } + ImportDefaultAccountHierarchy(ref MainDS, ANewLedgerNumber, ref AVerificationResult); ImportDefaultCostCentreHierarchy(ref MainDS, ANewLedgerNumber, ALedgerName); - TSystemDefaults SystemDefaults = new TSystemDefaults(db); if (SystemDefaults.GetBooleanDefault( SharedConstants.SYSDEFAULT_ILTPROCESSINGENABLED, false) == true) { diff --git a/csharp/ICT/Petra/Tools/SampleDataConstructor/GenerateLedger.cs b/csharp/ICT/Petra/Tools/SampleDataConstructor/GenerateLedger.cs index 301c434b04..bd0696131d 100644 --- a/csharp/ICT/Petra/Tools/SampleDataConstructor/GenerateLedger.cs +++ b/csharp/ICT/Petra/Tools/SampleDataConstructor/GenerateLedger.cs @@ -103,7 +103,7 @@ public static void CreateNewLedger() TGLSetupWebConnector.CreateNewLedger(FLedgerNumber, "SecondLedger", "GB", "EUR", "EUR", new DateTime(DateTime.Now.Year - 1, 4, 1), - 12, 1, FNumberOfFwdPostingPeriods, out VerificationResult); + 12, 1, FNumberOfFwdPostingPeriods, false, out VerificationResult); } /// diff --git a/csharp/ICT/Testing/lib/MFinance/server/GL/Test.GL.PeriodEnd.Month.cs b/csharp/ICT/Testing/lib/MFinance/server/GL/Test.GL.PeriodEnd.Month.cs index f2c6aeab52..501963660e 100644 --- a/csharp/ICT/Testing/lib/MFinance/server/GL/Test.GL.PeriodEnd.Month.cs +++ b/csharp/ICT/Testing/lib/MFinance/server/GL/Test.GL.PeriodEnd.Month.cs @@ -4,7 +4,7 @@ // @Authors: // wolfgangu, timop // -// Copyright 2004-2019 by OM International +// Copyright 2004-2021 by OM International // // This file is part of OpenPetra.org. // @@ -399,7 +399,8 @@ public void Test_SwitchToNextMonth() public void Init() { TPetraServerConnector.Connect(); - FLedgerNumber = CommonNUnitFunctions.CreateNewLedger(); + bool WITH_ILT = true; + FLedgerNumber = CommonNUnitFunctions.CreateNewLedger(null, WITH_ILT); FledgerInfo = new TLedgerInfo(FLedgerNumber); System.Diagnostics.Debug.WriteLine("Init: " + this.ToString()); diff --git a/csharp/ICT/Testing/lib/NUnitTools/CommonNUnitFunctions.cs b/csharp/ICT/Testing/lib/NUnitTools/CommonNUnitFunctions.cs index e1543a9f32..d9430224a0 100644 --- a/csharp/ICT/Testing/lib/NUnitTools/CommonNUnitFunctions.cs +++ b/csharp/ICT/Testing/lib/NUnitTools/CommonNUnitFunctions.cs @@ -4,7 +4,7 @@ // @Authors: // wolfgangu, timop // -// Copyright 2004-2020 by OM International +// Copyright 2004-2021 by OM International // // This file is part of OpenPetra.org. // @@ -226,7 +226,7 @@ public static void LoadTestDataBase(string strSqlFilePathFromCSharpName, int ALe /// create a new ledger, with new ledgernumber /// /// ledgernumber of new ledger - public static int CreateNewLedger(DateTime? AStartDate = null) + public static int CreateNewLedger(DateTime? AStartDate = null, bool AWithILT = false) { TDBTransaction ReadTransaction = new TDBTransaction(); TDataBase db = DBAccess.Connect("NUnitFunctions.CreateNewLedger"); @@ -265,6 +265,7 @@ public static int CreateNewLedger(DateTime? AStartDate = null) 12, 1, 8, + AWithILT, out VerificationResult); return newLedgerNumber; From 4b4e5a9ef78de415fb890ebc96e03c2f2f0b58b4 Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Sat, 22 May 2021 07:29:54 +0200 Subject: [PATCH 04/58] fix period end test for ILT cost centres --- .../server/GL/Test.GL.PeriodEnd.Month.cs | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/csharp/ICT/Testing/lib/MFinance/server/GL/Test.GL.PeriodEnd.Month.cs b/csharp/ICT/Testing/lib/MFinance/server/GL/Test.GL.PeriodEnd.Month.cs index 501963660e..53884fa1e3 100644 --- a/csharp/ICT/Testing/lib/MFinance/server/GL/Test.GL.PeriodEnd.Month.cs +++ b/csharp/ICT/Testing/lib/MFinance/server/GL/Test.GL.PeriodEnd.Month.cs @@ -69,7 +69,6 @@ public class TestGLPeriodicEndMonth [Test] public void Test_PEMM_02_UnpostedBatches() { - // System.Diagnostics.Debug.WriteLine( UnloadTestData_GetBatchInfo(); Assert.AreEqual(0, new GetBatchInfo( FLedgerNumber, FledgerInfo.CurrentFinancialYear, FledgerInfo.CurrentPeriod).NumberOfBatches, "No unposted batch shall be found"); @@ -80,7 +79,6 @@ public void Test_PEMM_02_UnpostedBatches() FLedgerNumber, FledgerInfo.CurrentFinancialYear, FledgerInfo.CurrentPeriod).NumberOfBatches, "Two of the four batches shall be found"); - //UnloadTestData_GetBatchInfo(); TVerificationResultCollection verificationResult; List glBatchNumbers; @@ -115,8 +113,11 @@ public void Test_PEMM_02_UnpostedBatches() [Test] public void Test_PEMM_03_SuspensedAccounts() { + bool WITH_ILT = true; + int LedgerNumber = CommonNUnitFunctions.CreateNewLedger(null, WITH_ILT); + TCommonAccountingTool commonAccountingTool = - new TCommonAccountingTool(FLedgerNumber, "NUNIT"); + new TCommonAccountingTool(LedgerNumber, "NUNIT"); commonAccountingTool.AddBaseCurrencyJournal(); commonAccountingTool.JournalDescription = "Test Data accounts"; @@ -128,14 +129,14 @@ public void Test_PEMM_03_SuspensedAccounts() "0100", "7300", "Gift Example", "Credit", MFinanceConstants.IS_CREDIT, 100); commonAccountingTool.CloseSaveAndPost(); // returns true if posting seemed to work - new ChangeSuspenseAccount(FLedgerNumber, strAccountBank).Suspense(); + new ChangeSuspenseAccount(LedgerNumber, strAccountBank).Suspense(); TVerificationResultCollection verificationResult; List glBatchNumbers; Boolean stewardshipBatch; bool blnHasErrors = !TPeriodIntervalConnector.PeriodMonthEnd( // Changed to InfoMode because - FLedgerNumber, true, // the suspense accounts warning is now shown only in InfoMode. + LedgerNumber, true, // the suspense accounts warning is now shown only in InfoMode. out glBatchNumbers, out stewardshipBatch, out verificationResult); @@ -161,18 +162,18 @@ public void Test_PEMM_03_SuspensedAccounts() while (!blnHasErrors && periodCounter < 12) { blnHasErrors = !TPeriodIntervalConnector.PeriodMonthEnd( - FLedgerNumber, false, + LedgerNumber, false, out glBatchNumbers, out stewardshipBatch, out verificationResult); Assert.IsFalse(blnHasErrors, "there was an error closing period " + periodCounter.ToString()); periodCounter++; - Assert.AreEqual(periodCounter, new TLedgerInfo(FLedgerNumber).CurrentPeriod, "should be in new period"); + Assert.AreEqual(periodCounter, new TLedgerInfo(LedgerNumber).CurrentPeriod, "should be in new period"); } blnHasErrors = !TPeriodIntervalConnector.PeriodMonthEnd( - FLedgerNumber, false, + LedgerNumber, false, out glBatchNumbers, out stewardshipBatch, out verificationResult); @@ -192,7 +193,7 @@ public void Test_PEMM_03_SuspensedAccounts() Assert.IsTrue(blnStatusArrived, "there should be a critical error PEEC_07 for the suspense account"); Assert.IsTrue(blnHasErrors, "there should be an error because we cannot close the last period due to suspense account with a balance"); - new ChangeSuspenseAccount(FLedgerNumber, strAccountBank).Unsuspense(); + new ChangeSuspenseAccount(LedgerNumber, strAccountBank).Unsuspense(); } private void ImportGiftBatch(DateTime AEffectiveDate) @@ -269,14 +270,14 @@ public void Test_PEMM_04_UnpostedGifts() [Test] public void Test_PEMM_05_Revaluation() { - FLedgerNumber = CommonNUnitFunctions.CreateNewLedger(); + int LedgerNumber = CommonNUnitFunctions.CreateNewLedger(); // load foreign currency account 6001 CommonNUnitFunctions.LoadTestDataBase("csharp\\ICT\\Testing\\lib\\MFinance\\server\\GL\\" + - "test-sql\\gl-test-account-data.sql", FLedgerNumber); + "test-sql\\gl-test-account-data.sql", LedgerNumber); // post a batch for foreign currency account 6001 TCommonAccountingTool commonAccountingTool = - new TCommonAccountingTool(FLedgerNumber, "NUNIT"); + new TCommonAccountingTool(LedgerNumber, "NUNIT"); commonAccountingTool.AddForeignCurrencyJournal("GBP", 1.1m); commonAccountingTool.JournalDescription = "Test foreign currency account"; string strAccountGift = "0200"; @@ -284,10 +285,10 @@ public void Test_PEMM_05_Revaluation() // Accounting of some gifts ... commonAccountingTool.AddBaseCurrencyTransaction( - strAccountBank, (FLedgerNumber * 100).ToString(), "Gift Example", "Debit", MFinanceConstants.IS_DEBIT, 100); + strAccountBank, (LedgerNumber * 100).ToString(), "Gift Example", "Debit", MFinanceConstants.IS_DEBIT, 100); commonAccountingTool.AddBaseCurrencyTransaction( - strAccountGift, (FLedgerNumber * 100).ToString(), "Gift Example", "Credit", MFinanceConstants.IS_CREDIT, 100); + strAccountGift, (LedgerNumber * 100).ToString(), "Gift Example", "Credit", MFinanceConstants.IS_CREDIT, 100); Boolean PostedOk = commonAccountingTool.CloseSaveAndPost(); // returns true if posting seemed to work Assert.IsTrue(PostedOk, "Post foreign gift batch"); @@ -299,7 +300,7 @@ public void Test_PEMM_05_Revaluation() * This error is no longer critical - it's OK to run month end even if a reval is required. (Mantis# 03905) * * bool blnHasErrors = !TPeriodIntervalConnector.TPeriodMonthEnd( - * FLedgerNumber, true, out verificationResult); + * LedgerNumber, true, out verificationResult); * * for (int i = 0; i < verificationResult.Count; ++i) * { @@ -317,9 +318,9 @@ public void Test_PEMM_05_Revaluation() Int32 forexBatchNumber; List glBatchNumbers; Boolean stewardshipBatch; - TLedgerInfo ledgerinfo = new TLedgerInfo(FLedgerNumber); + TLedgerInfo ledgerinfo = new TLedgerInfo(LedgerNumber); - Boolean revalueOk = TRevaluationWebConnector.Revaluate(FLedgerNumber, + Boolean revalueOk = TRevaluationWebConnector.Revaluate(LedgerNumber, new string[] { strAccountGift }, new string[] { "GBP" }, new decimal[] { 1.2m }, @@ -336,7 +337,7 @@ public void Test_PEMM_05_Revaluation() Assert.IsTrue(revalueOk, "Problem running the revaluation"); Boolean Err = !TPeriodIntervalConnector.PeriodMonthEnd( - FLedgerNumber, true, + LedgerNumber, true, out glBatchNumbers, out stewardshipBatch, out verificationResult); @@ -356,8 +357,8 @@ public void Test_PEMM_05_Revaluation() [Test] public void Test_SwitchToNextMonth() { - FLedgerNumber = CommonNUnitFunctions.CreateNewLedger(); - TLedgerInfo LedgerInfo = new TLedgerInfo(FLedgerNumber); + int LedgerNumber = CommonNUnitFunctions.CreateNewLedger(); + TLedgerInfo LedgerInfo = new TLedgerInfo(LedgerNumber); int Counter = 0; do @@ -367,7 +368,7 @@ public void Test_SwitchToNextMonth() Assert.Greater(20, Counter, "Too many loops"); // Set revaluation flag ... - new TLedgerInitFlag(FLedgerNumber, + new TLedgerInitFlag(LedgerNumber, "Reval").IsSet = true; // Run MonthEnd ... @@ -376,7 +377,7 @@ public void Test_SwitchToNextMonth() Boolean stewardshipBatch; bool blnHasErrors = !TPeriodIntervalConnector.PeriodMonthEnd( - FLedgerNumber, false, + LedgerNumber, false, out glBatchNumbers, out stewardshipBatch, out verificationResult); @@ -399,8 +400,7 @@ public void Test_SwitchToNextMonth() public void Init() { TPetraServerConnector.Connect(); - bool WITH_ILT = true; - FLedgerNumber = CommonNUnitFunctions.CreateNewLedger(null, WITH_ILT); + FLedgerNumber = CommonNUnitFunctions.CreateNewLedger(); FledgerInfo = new TLedgerInfo(FLedgerNumber); System.Diagnostics.Debug.WriteLine("Init: " + this.ToString()); From 938a5d08d8e87e12054dc9a80af034fa842b5aed Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Sat, 22 May 2021 21:35:40 +0200 Subject: [PATCH 05/58] Fix for Postgresql: setSystemDefault and getSystemDefault does not work, probably because of transaction. --- csharp/ICT/Petra/Server/lib/MFinance/setup/GL.Setup.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csharp/ICT/Petra/Server/lib/MFinance/setup/GL.Setup.cs b/csharp/ICT/Petra/Server/lib/MFinance/setup/GL.Setup.cs index df1b0bad56..06882df79d 100644 --- a/csharp/ICT/Petra/Server/lib/MFinance/setup/GL.Setup.cs +++ b/csharp/ICT/Petra/Server/lib/MFinance/setup/GL.Setup.cs @@ -4464,7 +4464,7 @@ public static bool GetCurrencyCodes(out ACurrencyTable AResultTable) ImportDefaultAccountHierarchy(ref MainDS, ANewLedgerNumber, ref AVerificationResult); ImportDefaultCostCentreHierarchy(ref MainDS, ANewLedgerNumber, ALedgerName); - if (SystemDefaults.GetBooleanDefault( + if (AWithILT || SystemDefaults.GetBooleanDefault( SharedConstants.SYSDEFAULT_ILTPROCESSINGENABLED, false) == true) { ACostCentreRow newCostCentreRow = MainDS.ACostCentre.NewRowTyped(); From a72ce49fb428583f6e28bf122b76d969308e1af5 Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Wed, 2 Jun 2021 22:08:22 +0200 Subject: [PATCH 06/58] convert GnuCash skr49 german account hierarchy to OpenPetra yml file. fixes for importing account hierarchy. print proper error messages if the yml format is broken. fixes #293 --- csharp/ICT/Common/IO/Yml2Xml.cs | 2 + .../Server/lib/MFinance/setup/GL.Setup.cs | 50 +- demodata/finance/skr49/.gitignore | 1 + demodata/finance/skr49/README.md | 9 + demodata/finance/skr49/convert.py | 144 ++ demodata/finance/skr49/skr49_accounts.yml | 1823 +++++++++++++++++ .../src/forms/Finance/Setup/GL/AccountTree.js | 3 +- js-client/src/lib/utils.js | 3 + 8 files changed, 2020 insertions(+), 15 deletions(-) create mode 100644 demodata/finance/skr49/.gitignore create mode 100644 demodata/finance/skr49/README.md create mode 100755 demodata/finance/skr49/convert.py create mode 100644 demodata/finance/skr49/skr49_accounts.yml diff --git a/csharp/ICT/Common/IO/Yml2Xml.cs b/csharp/ICT/Common/IO/Yml2Xml.cs index 0444f0ff68..61d104baf9 100644 --- a/csharp/ICT/Common/IO/Yml2Xml.cs +++ b/csharp/ICT/Common/IO/Yml2Xml.cs @@ -756,6 +756,8 @@ private void ParseNode(XmlNode parent, int ADepth) } PrintedOriginalError = true; + + throw new Exception("Problem in line " + currentLine.ToString() + " " + line); } throw; diff --git a/csharp/ICT/Petra/Server/lib/MFinance/setup/GL.Setup.cs b/csharp/ICT/Petra/Server/lib/MFinance/setup/GL.Setup.cs index 06882df79d..fad154b236 100644 --- a/csharp/ICT/Petra/Server/lib/MFinance/setup/GL.Setup.cs +++ b/csharp/ICT/Petra/Server/lib/MFinance/setup/GL.Setup.cs @@ -1046,6 +1046,7 @@ public static GLSetupTDS LoadAccountHierarchies(Int32 ALedgerNumber) AFeesPayableAccess.LoadViaALedger(MainDS, ALedgerNumber, Transaction); AGeneralLedgerMasterAccess.LoadUsingTemplate(MainDS, template, Transaction); ASuspenseAccountAccess.LoadViaALedger(MainDS, ALedgerNumber, Transaction); + ATransactionTypeAccess.LoadViaALedger(MainDS, ALedgerNumber, Transaction); }); // set Account BankAccountFlag if there exists a property @@ -1191,11 +1192,15 @@ public static string LoadAccountHierarchyHtmlCode(Int32 ALedgerNumber, string AA AAccountHierarchyDetailTable.GetAccountHierarchyCodeDBName() + " = '" + AAccountHierarchyCode + "' AND " + AAccountHierarchyDetailTable.GetAccountCodeToReportToDBName() + " = '" + accountHierarchy.RootAccountCode + "'"; - result.Append(InsertNodeIntoHTMLTreeView( + + foreach (DataRowView vrow in MainDS.AAccountHierarchyDetail.DefaultView) + { + result.Append(InsertNodeIntoHTMLTreeView( MainDS, ALedgerNumber, - (AAccountHierarchyDetailRow)MainDS.AAccountHierarchyDetail.DefaultView[0].Row, + (AAccountHierarchyDetailRow)vrow.Row, true)); + } } return result.ToString(); @@ -2929,8 +2934,12 @@ public static bool ExportAccountHierarchy(Int32 ALedgerNumber, string AAccountHi AAccountHierarchyDetailTable.GetAccountHierarchyCodeDBName() + " = '" + AAccountHierarchyName + "' AND " + AAccountHierarchyDetailTable.GetAccountCodeToReportToDBName() + " = '" + accountHierarchy.RootAccountCode + "'"; - InsertNodeIntoXmlDocument(MainDS, xmlDoc, xmlDoc.DocumentElement, - (AAccountHierarchyDetailRow)MainDS.AAccountHierarchyDetail.DefaultView[0].Row); + + foreach (DataRowView vrow in MainDS.AAccountHierarchyDetail.DefaultView) + { + InsertNodeIntoXmlDocument(MainDS, xmlDoc, xmlDoc.DocumentElement, + (AAccountHierarchyDetailRow)vrow.Row); + } } } catch (Exception ex) @@ -3276,15 +3285,17 @@ public static bool ImportAccountHierarchy(Int32 ALedgerNumber, string AHierarchy TYml2Xml ymlParser = new TYml2Xml(AYmlAccountHierarchy.Split(new char[] { '\n' })); XMLDoc = ymlParser.ParseYML2XML(); } - catch (XmlException exp) + catch (Exception exp) { TLogging.Log(exp.ToString()); - throw new Exception( - Catalog.GetString("There was a problem with the syntax of the file.") + - Environment.NewLine + - exp.Message + - Environment.NewLine + - AYmlAccountHierarchy); + AVerificationResult.Add(new TVerificationResult( + Catalog.GetString("Import hierarchy"), + "base64" + THttpBinarySerializer.SerializeToBase64( + Catalog.GetString("There was a problem with the syntax of the file: ") + + Environment.NewLine + + exp.Message), + TResultSeverity.Resv_Critical)); + return false; } } @@ -3304,7 +3315,11 @@ public static bool ImportAccountHierarchy(Int32 ALedgerNumber, string AHierarchy } } - CreateAccountHierarchyRecursively(ref MainDS, ALedgerNumber, ref ImportedAccountNames, Root, ALedgerNumber.ToString(), ref AVerificationResult); + while (Root != null) + { + CreateAccountHierarchyRecursively(ref MainDS, ALedgerNumber, ref ImportedAccountNames, Root, ALedgerNumber.ToString(), ref AVerificationResult); + Root = Root.NextSibling; + } foreach (AAccountRow accountRow in MainDS.AAccount.Rows) { @@ -3325,9 +3340,16 @@ public static bool ImportAccountHierarchy(Int32 ALedgerNumber, string AHierarchy if (transTbl.Rows.Count == 0) // No-one's used this account, so I can delete it. { - // - // If the deleted account included Analysis types I need to unlink them from the Account first. + // remove transaction types if they reference the account + foreach (ATransactionTypeRow Row in MainDS.ATransactionType.Rows) + { + if ((Row.RowState != DataRowState.Deleted) && (Row.LedgerNumber == ALedgerNumber) && (Row.DebitAccountCode == accountRow.AccountCode || Row.CreditAccountCode == accountRow.AccountCode)) + { + Row.Delete(); + } + } + // If the deleted account included Analysis types I need to unlink them from the Account first. foreach (AAnalysisAttributeRow Row in MainDS.AAnalysisAttribute.Rows) { if ((Row.LedgerNumber == ALedgerNumber) && (Row.AccountCode == accountRow.AccountCode)) diff --git a/demodata/finance/skr49/.gitignore b/demodata/finance/skr49/.gitignore new file mode 100644 index 0000000000..26013f58fb --- /dev/null +++ b/demodata/finance/skr49/.gitignore @@ -0,0 +1 @@ +acctchrt_skr49.gnucash-xea diff --git a/demodata/finance/skr49/README.md b/demodata/finance/skr49/README.md new file mode 100644 index 0000000000..7cc2d5f917 --- /dev/null +++ b/demodata/finance/skr49/README.md @@ -0,0 +1,9 @@ +We are using the SKR49 file from GnuCash, convert it from XML to our yml format with a Python script, and then you can import it into OpenPetra. + +``` +curl https://raw.githubusercontent.com/Gnucash/gnucash/maint/data/accounts/de_DE/acctchrt_skr49.gnucash-xea > acctchrt_skr49.gnucash-xea +export LANG=de_DE.utf8 +python3 convert.py > skr49_accounts.yml +``` + +Now import that file `skr49_accounts.yml` to your OpenPetra instance, https://openpetra.example.org/Finance/Setup/GL/AccountTree diff --git a/demodata/finance/skr49/convert.py b/demodata/finance/skr49/convert.py new file mode 100755 index 0000000000..9c8f0d174e --- /dev/null +++ b/demodata/finance/skr49/convert.py @@ -0,0 +1,144 @@ +#!/bin/python3 + +import xml.etree.ElementTree as ET +import os + +gnucash_skr49_url = "https://raw.githubusercontent.com/Gnucash/gnucash/maint/data/accounts/de_DE/acctchrt_skr49.gnucash-xea" +if not os.path.isfile(os.path.basename(gnucash_skr49_url)): + print("Please download: curl %s > %s" % (gnucash_skr49_url,os.path.basename(gnucash_skr49_url))) + exit(-1) + +if not ("LANG" in os.environ and os.environ["LANG"] == "de_DE.utf8"): + print("Please export LANG=de_DE.utf8") + exit(-1) + +mytree = ET.parse(os.path.basename(gnucash_skr49_url)) +myroot = mytree.getroot() +namespaces = {'gnc': 'http://www.gnucash.org/XML/gnc','act':'http://www.gnucash.org/XML/act', 'gnc-act':'http://www.gnucash.org/XML/gnc-act'} + +class Account(object): + pass + +def export_account(parent, accounts, depth): + children = {} + for acct_id in accounts: + account = accounts[acct_id] + if account.parent == parent.id: + children[account.code] = account + + for code in sorted(children): + account = children[code] + + is_leaf = True + for acct_child_id in accounts: + acct_child = accounts[acct_child_id] + if acct_child.parent == account.id: + is_leaf = False + break + + active="True" + if account.descr == "VERALTET!": + active = "False" + line = ((depth*2)*' ') + line += '%s: {active=%s' % (account.code, active) + + if parent.parent is None: + line += ', type=%s, debitcredit=%s, validcc=All' % (account.type, account.debitcredit) + else: + if parent.type != account.type: + line += ', type=%s' % (account.type,) + if parent.debitcredit != account.debitcredit: + line += ', debitcredit=%s' % (account.debitcredit,) + if is_leaf: + line += ', validcc=Local' + if account.descr == account.shortdescr: + line += ', shortdesc="%s"' % (account.descr) + else: + line += ', shortdesc="%s", longdesc="%s"' % (account.shortdescr, account.descr) + if account.bankaccount == True: + line += ', bankaccount=true' + line += "}" + print(line) + + if not is_leaf: + export_account(account, accounts, depth + 1) + + +accounts = {} +root_account = None + +# parse all accounts +for acct in myroot.findall('.//gnc:account', namespaces): + obj = Account() + obj.id = acct.find('act:id', namespaces).text + if acct.find('act:parent', namespaces) is not None: + obj.parent = acct.find('act:parent', namespaces).text + else: + obj.parent = None + obj.name = acct.find('act:name', namespaces).text + if acct.find('act:code', namespaces) is not None: + obj.code = acct.find('act:code', namespaces).text + else: + # bug: there is a missing code, in 4500-4504 Abschreibungen + obj.code = obj.name.split(' ')[0] + # bug in account 0674 + if obj.name == "0675 Gegenkonto 0653-0654, 0661-0664, 0670-0672, 0675-0679, 0687-0689, 0697-0699 bei Aufteilung Debitorenkonto": + obj.code = "0674" + obj.name = "0674 Gegenkonto 0653-0654, 0661-0664, 0670-0672, 0675-0679, 0687-0689, 0697-0699 bei Aufteilung Debitorenkonto" + # bug: duplicate code 5490 + if obj.code == "5490" and obj.id == "0467d26561464460851449d59cb02696": + # ignore this + continue + obj.shortdescr = obj.name[len(obj.code) + 1:] + if acct.find('act:description', namespaces) is not None: + obj.descr = acct.find('act:description', namespaces).text.replace("\n", " ") + else: + obj.descr = '' + obj.type = acct.find('act:type', namespaces).text + obj.bankaccount = False + if obj.type == "ASSET" or obj.type == "ROOT": + obj.type = "Asset" + obj.debitcredit = "debit" + elif obj.type == "INCOME": + obj.type = "Income" + obj.debitcredit = "credit" + elif obj.type == "EXPENSE": + obj.type = "Expense" + obj.debitcredit = "debit" + elif obj.type == "LIABILITY": + obj.type = "Liability" + obj.debitcredit = "credit" + elif obj.type == "CASH" or obj.type == "BANK": + obj.type = "Asset" + obj.debitcredit = "debit" + obj.bankaccount = True + elif obj.type == "PAYABLE": + obj.type = "Liability" + obj.debitcredit = "credit" + elif obj.type == "RECEIVABLE": + obj.type = "Asset" + obj.debitcredit = "debit" + elif obj.type == "CREDIT": + obj.type = "Liability" + obj.debitcredit = "credit" + else: + raise Exception("unknown type %s for account %s" % (obj.type,obj.name)) + + if obj.parent is None: + root_account = obj + else: + accounts[obj.id] = obj + +# export hierarchy +title = myroot.findall('.//gnc-act:title', namespaces)[0].text +shortdesc = myroot.findall('.//gnc-act:short-description', namespaces)[0].text +longdesc = myroot.findall('.//gnc-act:long-description', namespaces)[0].text.replace('\n', '\n# ') + +print("# %s" % (title,)) +print("#") +print("# %s" % (shortdesc,)) +print("#") +print("# %s" % (longdesc,)) +print("RootNodeInternal:") +export_account(root_account, accounts, 1) + diff --git a/demodata/finance/skr49/skr49_accounts.yml b/demodata/finance/skr49/skr49_accounts.yml new file mode 100644 index 0000000000..ae6e9b413e --- /dev/null +++ b/demodata/finance/skr49/skr49_accounts.yml @@ -0,0 +1,1823 @@ +# Kontenrahmen SKR49 für Vereine, Stiftungen, gGmbHs +# +# Datev-Kontenrahmen SKR49 für Vereine, Stiftungen und gemeinnützige GmbHs +# +# Ein Kontenrahmen für Vereine nach dem SKR49 der Datev +# +# Bei Gebrauch dieses Kontenrahmens sind die allgemeinen Konten abzuwählen. +# An dem Rahmen sind selbstverständlich noch Anpassungen erforderlich, +# bis man den seinen Bedürfnissen entsprechenden Kontenplan hat. +# Hinweise zur Verwendung: https://wiki.gnucash.org/wiki/De/SKR49 +# +# Ersteller: Michael Braun 2009, michael-developer@fami-braun.de +# Formalia für GnuCash-Vorlagen: Frank H. Ellenberger 2009 +# Erweitert auf den Stand 2018: Christoph Franzen 2017-2018, christoph@alte-pflasterei.de +# +RootNodeInternal: + 0: {active=True, type=Asset, debitcredit=debit, validcc=All, shortdesc="aktive Vermögensposten", longdesc="Bestandskonten Aktiva"} + 0001: {active=False, validcc=Local, shortdesc="Ansprüche auf Einzahlung in das Stiftungskapital/Stammkapital", longdesc="VERALTET!"} + 0002: {active=False, validcc=Local, shortdesc="Ingangsetzungs- und Erweiterungsaufwand", longdesc="VERALTET!"} + 0010-0249: {active=True, shortdesc="ANLAGEVERMÖGEN", longdesc="Anlagevermögen"} + 0010-0049: {active=True, shortdesc="Immaterielle Vermögensgegenstände"} + 0010: {active=True, shortdesc="Entgeltlich erworbene Konzessionen, Schutzrechte, ähnliche Rechte und Lizenzen an solchen", longdesc="Entgeltlich erworbene Konzessionen, gewerbliche Schutzrechte und ähnliche Rechte und Werte sowie Lizenzen an solchen Rechten und Werten"} + 0015: {active=True, validcc=Local, shortdesc="Konzessionen"} + 0016-0018: {active=True, shortdesc="Ablöse", longdesc="Ablöse Sportler"} + 0016: {active=True, validcc=Local, shortdesc="Ablöse bezahlte Sportler"} + 0017: {active=True, validcc=Local, shortdesc="Ablöse unbezahlte Sportler bis 2556€", longdesc="Ablöse unbezahlte Sportler bis 2556 Euro"} + 0018: {active=True, validcc=Local, shortdesc="Ablöse unbezahlte Sportler über 2556€", longdesc="Ablöse unbezahlte Sportler über 2556 Euro"} + 0020: {active=True, validcc=Local, shortdesc="Gewerbliche Schutzrechte"} + 0025: {active=True, validcc=Local, shortdesc="Ähnliche Rechte und Werte"} + 0026: {active=True, validcc=Local, shortdesc="Rechtswerte"} + 0027: {active=True, validcc=Local, shortdesc="EDV-Software"} + 0030: {active=True, validcc=Local, shortdesc="Lizenzen an gewerblichen Schutzrechten und ähnlichem", longdesc="Lizenzen an gewerblichen Schutzrechten und ähnlichen Rechten und Werten"} + 0035+0040: {active=True, shortdesc="Geschäfts- oder Firmenwert"} + 0035: {active=True, validcc=Local, shortdesc="Geschäfts- oder Firmenwert"} + 0040: {active=True, validcc=Local, shortdesc="Verschmelzungsmehrwert"} + 0038-0039: {active=True, shortdesc="Geleistete Anzahlungen", longdesc="Geleistete Anzahlungen auf den Geschäfts- oder Firmenwert sowie auf immaterielle Vermögensgegenstände"} + 0038: {active=True, validcc=Local, shortdesc="Anzahlungen auf Geschäfts- oder Firmenwert"} + 0039: {active=True, validcc=Local, shortdesc="Anzahlungen auf immaterielle Vermögensgegenstände ", longdesc="Geleistete Anzahlungen auf immaterielleVermögensgegenstände"} + 0050-0249: {active=True, shortdesc="Sachanlagen"} + 0050-0099: {active=True, shortdesc="Grundstücke, grundstücksgleiche Rechte", longdesc="Grundstücke, grundstücksgleiche Rechte und Bauten"} + 0050: {active=True, validcc=Local, shortdesc="Grundstücke unbebaut"} + 0055: {active=True, validcc=Local, shortdesc="Grundstücke mit Gebäuden bebaut", longdesc="Grundstückswerte eigener Grundstücke bebaut mit Gebäuden"} + 0060: {active=True, validcc=Local, shortdesc="Grundstücke mit Anlagen bebaut", longdesc="Grundstückswerte eigener Grundstücke bebaut mit Anlagen"} + 0065: {active=True, validcc=Local, shortdesc="Grundstücke mit Substanzverzehr"} + 0070: {active=True, validcc=Local, shortdesc="Grundstücksgleiche Rechte", longdesc="Grundstücksgleiche Rechte (Erbbaurecht, Dauerwohnrecht, unbebaute Grundstücke)"} + 0100: {active=True, shortdesc="Gebäude"} + 0110: {active=True, validcc=Local, shortdesc="Vereinsheim"} + 0111: {active=True, validcc=Local, shortdesc="Sporthallen"} + 0112: {active=True, validcc=Local, shortdesc="Sportanlagen"} + 0120: {active=True, validcc=Local, shortdesc="Vereinsgaststätte"} + 0125: {active=True, validcc=Local, shortdesc="Sonstige Vereinsgebäude"} + 0130: {active=True, validcc=Local, shortdesc="Geschäftsbauten"} + 0135: {active=True, validcc=Local, shortdesc="Fabrikbauten"} + 0150: {active=True, validcc=Local, shortdesc="Garagen"} + 0155: {active=True, validcc=Local, shortdesc="Außenanlagen"} + 0160: {active=True, validcc=Local, shortdesc="Hof- und Wegebefestigungen"} + 0165: {active=True, validcc=Local, shortdesc="Wohnbauten"} + 0170: {active=True, validcc=Local, shortdesc="Einrichtungen für Gebäude"} + 0175: {active=True, validcc=Local, shortdesc="Ausbauten, Anbauten und Zubauten"} + 0180: {active=True, validcc=Local, shortdesc="Einbauten Pachtgrundstück"} + 0185: {active=True, validcc=Local, shortdesc="Bauten auf fremden Grundstücken"} + 0200-0249: {active=True, shortdesc="Technische Anlagen und Maschinen"} + 0200: {active=True, validcc=Local, shortdesc="Technische Anlagen"} + 0205: {active=True, validcc=Local, shortdesc="Maschinen"} + 0210: {active=True, validcc=Local, shortdesc="Betriebsvorrichtungen"} + 0215: {active=True, validcc=Local, shortdesc="Sportvorrichtungen"} + 0220: {active=True, validcc=Local, shortdesc="Vereinsheimausstattung"} + 0250-0599: {active=True, shortdesc="ANDERE ANLAGEN, BETRIEBS- UND GESCHÄFTSAUSSTATTUNG", longdesc="Andere Anlagen, Betriebs- und Geschäftsausstattung"} + 0250-0299: {active=True, shortdesc="Fahrzeuge, Transportmittel"} + 0250: {active=True, shortdesc="Kraftfahrzeuge, Transportmittel"} + 0255: {active=True, validcc=Local, shortdesc="PKW"} + 0260: {active=True, validcc=Local, shortdesc="Anhänger"} + 0265: {active=True, validcc=Local, shortdesc="Pflegemaschinen"} + 0300: {active=True, shortdesc="Vereinsausstattung"} + 0305: {active=True, validcc=Local, shortdesc="Vereinskleidung"} + 0310: {active=True, validcc=Local, shortdesc="Sportgeräte"} + 0315: {active=True, validcc=Local, shortdesc="Werkzeuge"} + 0320: {active=True, validcc=Local, shortdesc="Büroeinrichtung"} + 0330: {active=False, validcc=Local, shortdesc="Einrichtung Vereinsheim", longdesc="VERALTET!"} + 0335: {active=True, validcc=Local, shortdesc="Sonstiges Inventar"} + 0340: {active=True, validcc=Local, shortdesc="Geringwertige Wirtschaftsgüter"} + 0341: {active=True, validcc=Local, shortdesc="Wirtschaftsgüter"} + 0400: {active=True, shortdesc="Sonstige Anlagen und Ausstattung"} + 0405: {active=True, validcc=Local, shortdesc="Betriebsausstattung"} + 0410: {active=True, validcc=Local, shortdesc="Geschäftsausstattung"} + 0415: {active=True, validcc=Local, shortdesc="Büroeinrichtung"} + 0420: {active=True, validcc=Local, shortdesc="Ladeneinrichtung"} + 0425: {active=True, validcc=Local, shortdesc="Werkzeuge"} + 0430: {active=True, validcc=Local, shortdesc="Einbauten"} + 0475: {active=True, validcc=Local, shortdesc="Geringwertige Wirtschaftsgüter"} + 0476: {active=True, validcc=Local, shortdesc="Wirtschaftsgüter"} + 0480-0499: {active=True, shortdesc="Geleistete Anzahlungen, Anlagen im Bau"} + 0480: {active=True, validcc=Local, shortdesc="Geleistete Anzahlungen Grundstücke / Gebäude", longdesc="Geleistete Anzahlungen auf Grundstücke und Gebäude"} + 0485: {active=True, validcc=Local, shortdesc="Gebäude im Bau"} + 0490: {active=True, validcc=Local, shortdesc="Geleistete Anzahlungen sonstige Sachanlagen"} + 0495: {active=True, validcc=Local, shortdesc="Sonstige Sachanlagen im Bau"} + 0500-0599: {active=True, shortdesc="Finanzanlagen"} + 0500: {active=True, shortdesc="Anteile an verbundenen Unternehmen", longdesc="Anteile an verbundenen Unternehmen (Anlagevermögen)"} + 0504: {active=True, validcc=Local, shortdesc="Anteile an herrschender oder mit Mehrheit beteiligter Gesellschaft"} + 0505: {active=True, validcc=Local, shortdesc="Ausleihungen an verbundene Unternehmen"} + 0510: {active=True, shortdesc="Beteiligungen"} + 0513: {active=True, validcc=Local, shortdesc="Typisch stille Beteiligungen"} + 0516: {active=True, validcc=Local, shortdesc="Atypisch stille Beteiligungen"} + 0517: {active=True, validcc=Local, shortdesc="Beteiligungen an Kapitalgesellschaften", longdesc="Andere Beteiligungen an Kapitalgesellschaften"} + 0518: {active=True, validcc=Local, shortdesc="Beteiligungen an Personengesellschaften", longdesc="Andere Beteiligungen an Personengesellschaften"} + 0530: {active=True, shortdesc="Rechtswerte"} + 0531: {active=True, validcc=Local, shortdesc="Ablöse bezahlte Sportler"} + 0533: {active=True, validcc=Local, shortdesc="Ablöse unbezahlte Sportler <2556€", longdesc="Ablöse unbezahlte Sportler bis 2556 Euro"} + 0534: {active=True, validcc=Local, shortdesc="Ablöse unbezahlte Sportler >2556€", longdesc="Ablöse unbezahlte Sportler über 2556 Euro"} + 0540: {active=True, validcc=Local, shortdesc="Ausleihungen an Unternehmen, mit denen ein Beteiligungsverhältnis besteht"} + 0545: {active=True, validcc=Local, shortdesc="Wertpapiere des Anlagevermögens"} + 0550: {active=True, shortdesc="Sonstige Ausleihungen"} + 0555: {active=True, validcc=Local, shortdesc="Geleistete Kautionen"} + 0560: {active=True, validcc=Local, shortdesc="Darlehen"} + 0600-0989: {active=True, shortdesc="UMLAUFVERMÖGEN", longdesc="Umlaufvermögen"} + 0600-0629: {active=True, shortdesc="Vorräte"} + 0600: {active=True, validcc=Local, shortdesc="Roh-, Hilfs- und Betriebsstoffe"} + 0610: {active=True, validcc=Local, shortdesc="Unfertige Erzeugnisse, Leistungen", longdesc="Unfertige Erzeugnisse, Leistungen (Bestand)"} + 0620-0629: {active=True, shortdesc="Fertige Erzeugnisse, Waren", longdesc="Fertige Erzeugnisse, Waren, Material"} + 0620: {active=True, validcc=Local, shortdesc="Waren"} + 0621: {active=True, validcc=Local, shortdesc="Fertige Erzeugnisse"} + 0625: {active=True, validcc=Local, shortdesc="Waren / Material aus Sachspenden", longdesc="Waren und Material aus Sachspenden"} + 0630: {active=True, validcc=Local, shortdesc="Geleistete Anzahlungen", longdesc="Geleistete Anzahlungen auf Vorräte"} + 0634: {active=True, validcc=Local, shortdesc="Erhaltene Anzahlungen auf Bestellungen"} + 0640: {active=True, validcc=Local, shortdesc="Eingeforderte, noch ausstehende Kapitaleinlagen", longdesc="Eingeforderte ausstehende Einlagen auf das gezeichnete Kapital"} + 0641: {active=True, validcc=Local, shortdesc="Eingeforderte Nachschüsse"} + 0650-0899: {active=True, shortdesc="Forderungen, sonstige Vermögensgegenstände"} + 0650-0674: {active=True, shortdesc="Forderungen aus Lieferungen und Leistungen", longdesc="Forderungen aus Lieferungen und Leistungen oder sonstige Verbindlichkeiten"} + 0650: {active=True, shortdesc="Forderungen aus Lieferungen und Leistungen"} + 0651: {active=False, validcc=Local, shortdesc="Forderungen aus Lieferungen und Leistungen", longdesc="VERALTET!"} + 0652: {active=True, shortdesc="Forderungen aus Lieferungen und Leistungen ohne Kontokorrent"} + 0653: {active=True, validcc=Local, shortdesc="Forderungen aus L&L ohne KK < 1 Jahr", longdesc="Forderungen aus Lieferungen und Leistungen ohne Kontokorrent mit Restlaufzeit mehr als ein Jahr"} + 0654: {active=True, validcc=Local, shortdesc="Forderungen aus L&L ohne KK > 1 Jahr", longdesc="Forderungen aus Lieferungen und Leistungen ohne Kontokorrent mit Restlaufzeit bis zu einem Jahr"} + 0655: {active=True, validcc=Local, shortdesc="Forderungen aus Vereinsbereichen"} + 0656: {active=True, shortdesc="Wechsel aus Lieferungen und Leistungen"} + 0657: {active=True, validcc=Local, shortdesc="Wechsel aus Lieferungen und Leistungen <1 Jahr", longdesc="Wechsel aus Lieferungen und Leistungen – Restlaufzeit bis 1 Jahr"} + 0658: {active=True, validcc=Local, shortdesc="Wechsel aus Lieferungen und Leistungen >1 Jahr", longdesc="Wechsel aus Lieferungen und Leistungen – Restlaufzeit mehr als 1 Jahr"} + 0659: {active=True, validcc=Local, shortdesc="Bundesbankfähige Wechsel aus Lieferungen und Leistungen", longdesc="Wechsel aus Lieferungen und Leistungen, bundesbankfähig"} + 0660: {active=True, validcc=Local, shortdesc="Forderungen zu Einnahmen §11 Abs. 1 S. 2 EStG", longdesc="Forderungen nach §11 Absatz 1 Satz 2 EStG für §4 Absatz 3 EStG"} + 0661: {active=True, shortdesc="Zweifelhafte Forderungen"} + 0662: {active=True, validcc=Local, shortdesc="Zweifelhafte Forderungen <1 Jahr", longdesc="Zweifelhafte Forderungen – Restlaufzeit bis 1 Jahr"} + 0663: {active=True, validcc=Local, shortdesc="Zweifelhafte Forderungen >1 Jahr", longdesc="Zweifelhafte Forderungen – Restlaufzeit mehr als 1 Jahr"} + 0665-0668: {active=True, shortdesc="Wertberichtigungen auf Forderungen"} + 0665: {active=True, validcc=Local, shortdesc="Einzelwertberichtigungen Forderungen <1 Jahr", longdesc="Einzelwertberichtigungen auf Forderungen – Restlaufzeit bis 1 Jahr"} + 0666: {active=True, validcc=Local, shortdesc="Einzelwertberichtigungen Forderungen >1 Jahr", longdesc="Einzelwertberichtigungen auf Forderungen – Restlaufzeit mehr als 1 Jahr"} + 0667: {active=True, validcc=Local, shortdesc="Pauschalwertberichtigung Forderungen <1 Jahr", longdesc="Pauschalwertberichtigung auf Forderungen – Restlaufzeit bis 1 Jahr"} + 0668: {active=True, validcc=Local, shortdesc="Pauschalwertberichtigung Forderungen >1 Jahr", longdesc="Pauschalwertberichtigung auf Forderungen – Restlaufzeit mehr als 1 Jahr"} + 0670: {active=True, shortdesc="Forderungen aus Lieferungen und Leistungen gegen Gesellschafter"} + 0671: {active=True, validcc=Local, shortdesc="Forderungen aus Lieferungen und Leistungen gegen Gesellschafter <1 Jahr", longdesc="Forderungen aus Lieferungen und Leistungen gegen Gesellschafter – Restlaufzeit bis 1 Jahr"} + 0672: {active=True, validcc=Local, shortdesc="Forderungen aus Lieferungen und Leistungen gegen Gesellschafter >1 Jahr", longdesc="Forderungen aus Lieferungen und Leistungen gegen Gesellschafter – Restlaufzeit mehr als 1 Jahr"} + 0673: {active=True, validcc=Local, shortdesc="Gegenkonto zu 0700-0899 bei Buchungen über Debitorenkonto", longdesc="Gegenkonto zu „sonstige Vermögensgegenstände“ bei Buchungen über Debitorenkonto"} + 0674: {active=True, validcc=Local, shortdesc="Gegenkonto 0653-0654, 0661-0664, 0670-0672, 0675-0679, 0687-0689, 0697-0699 bei Aufteilung Debitorenkonto"} + 0675-0676+0680-0689: {active=True, shortdesc="Forderungen / Verbindlichkeiten (verbundene Unternehmen)", longdesc="Forderungen gegen verbundene Unternehmen oder Verbindlichkeiten gegenüber verbundenen Unternehmen"} + 0675-0676: {active=True, shortdesc="Wertberichtigungen auf Forderungen gegen verbundene Unternehmen"} + 0675: {active=True, validcc=Local, shortdesc="Wertberichtigungen <1 Jahr auf Forderungen gegen verbundene Unternehmen", longdesc="Wertberichtigungen auf Forderungen gegen verbundene Unternehmen – Restlaufzeit bis 1 Jahr"} + 0676: {active=True, validcc=Local, shortdesc="Wertberichtigungen >1 Jahr auf Forderungen gegen verbundene Unternehmen", longdesc="Wertberichtigungen auf Forderungen gegen verbundene Unternehmen – Restlaufzeit mehr als 1 Jahr"} + 0680: {active=True, shortdesc="Forderungen gegen verbundene Unternehmen"} + 0681: {active=True, validcc=Local, shortdesc="Forderungen gegen verbundene Unternehmen <1 Jahr", longdesc="Forderungen gegen verbundene Unternehmen – Restlaufzeit bis 1 Jahr"} + 0682: {active=True, validcc=Local, shortdesc="Forderungen gegen verbundene Unternehmen >1 Jahr", longdesc="Forderungen gegen verbundene Unternehmen – Restlaufzeit mehr als 1 Jahr"} + 0683: {active=True, shortdesc="Besitzwechsel gegen verbundene Unternehmen"} + 0684: {active=True, validcc=Local, shortdesc="Besitzwechsel gegen verbundene Unternehmen <1 Jahr", longdesc="Besitzwechsel gegen verbundene Unternehmen – Restlaufzeit bis 1 Jahr"} + 0685: {active=True, validcc=Local, shortdesc="Besitzwechsel gegen verbundene Unternehmen >1 Jahr", longdesc="Besitzwechsel gegen verbundene Unternehmen – Restlaufzeit mehr als 1 Jahr"} + 0686: {active=True, validcc=Local, shortdesc="Bundesbankfähige Besitzwechsel gegen verbundene Unternehmen", longdesc="Besitzwechsel gegen verbundene Unternehmen, bundesbankfähig"} + 0687: {active=True, shortdesc="Forderungen aus Lieferungen und Leistungen gegen verbundene Unternehmen"} + 0688: {active=True, validcc=Local, shortdesc="Forderungen <1 Jahr aus L&L gegen verbundene Unternehmen", longdesc="Forderungen aus Lieferungen und Leistungen gegen verbundene Unternehmen – Restlaufzeit bis 1 Jahr"} + 0689: {active=True, validcc=Local, shortdesc="Forderungen >1 Jahr aus L&L gegen verbundene Unternehmen", longdesc="Forderungen aus Lieferungen und Leistungen gegen verbundene Unternehmen – Restlaufzeit mehr als 1 Jahr"} + 0677-0678+0690-0699: {active=True, shortdesc="Forderungen / Verbindlichkeiten (Unternehmen, mit denen ein Beteiligungsverhältnis besteht)", longdesc="Forderungen gegen Unternehmen, mit denen ein Beteiligungsverhältnis besteht oder Verbindlichkeiten gegenüber Unternehmen, mit denen ein Beteiligungsverhältnis besteht"} + 0677-0678: {active=True, shortdesc="Wertberichtigungen auf Forderungen gegen Unternehmen, mit denen ein Beteiligungsverhältnis besteht"} + 0677: {active=True, validcc=Local, shortdesc="Wertberichtigungen <1 Jahr auf Forderungen gegen Unternehmen, mit denen ein Beteiligungsverhältnis besteht", longdesc="Wertberichtigungen mit Restlaufzeit bis 1 Jahr auf Forderungen gegen Unternehmen, mit denen ein Beteiligungsverhältnis besteht"} + 0678: {active=True, validcc=Local, shortdesc="Wertberichtigungen >1 Jahr auf Forderungen gegen Unternehmen, mit denen ein Beteiligungsverhältnis besteht", longdesc="Wertberichtigungen mit Restlaufzeit mehr als 1 Jahr auf Forderungen gegen Unternehmen, mit denen ein Beteiligungsverhältnis besteht"} + 0690: {active=True, shortdesc="Forderungen gegen Unternehmen, mit denen ein Beteiligungsverhältnis besteht"} + 0691: {active=True, validcc=Local, shortdesc="Forderungen <1 Jahr gegen Unternehmen, mit denen ein Beteiligungsverhältnis besteht", longdesc="Forderungen gegen Unternehmen, mit denen ein Beteiligungsverhältnis besteht – Restlaufzeit bis 1 Jahr"} + 0692: {active=True, validcc=Local, shortdesc="Forderungen >1 Jahr gegen Unternehmen, mit denen ein Beteiligungsverhältnis besteht", longdesc="Forderungen gegen Unternehmen, mit denen ein Beteiligungsverhältnis besteht – Restlaufzeit mehr als 1 Jahr"} + 0693: {active=True, shortdesc="Besitzwechsel gegen Unternehmen, mit denen ein Beteiligungsverhältnis besteht"} + 0694: {active=True, validcc=Local, shortdesc="Besitzwechsel <1 Jahr gegen Unternehmen, mit denen ein Beteiligungsverhältnis besteht", longdesc="Besitzwechsel gegen Unternehmen, mit denen ein Beteiligungsverhältnis besteht – Restlaufzeit bis 1 Jahr"} + 0695: {active=True, validcc=Local, shortdesc="Besitzwechsel >1 Jahr gegen Unternehmen, mit denen ein Beteiligungsverhältnis besteht", longdesc="Besitzwechsel gegen Unternehmen, mit denen ein Beteiligungsverhältnis besteht – Restlaufzeit mehr als 1 Jahr"} + 0696: {active=True, validcc=Local, shortdesc="Bundesbankfähige Besitzwechsel gegen Unternehmen, mit denen ein Beteiligungsverhältnis besteht", longdesc="Besitzwechsel gegen Unternehmen, mit denen ein Beteiligungsverhältnis besteht, bundesbankfähig"} + 0697: {active=True, shortdesc="Forderungen aus Lieferungen und Leistungen gegen Unternehmen, mit denen ein Beteiligungsverhältnis besteht"} + 0698: {active=True, validcc=Local, shortdesc="Forderungen <1 Jahr aus Lieferungen und Leistungen gegen Unternehmen, mit denen ein Beteiligungsverhältnis besteht", longdesc="Forderungen aus Lieferungen und Leistungen gegen Unternehmen, mit denen ein Beteiligungsverhältnis besteht – Restlaufzeit bis 1 Jahr"} + 0699: {active=True, validcc=Local, shortdesc="Forderungen >1 Jahr aus Lieferungen und Leistungen gegen Unternehmen, mit denen ein Beteiligungsverhältnis besteht", longdesc="Forderungen aus Lieferungen und Leistungen gegen Unternehmen, mit denen ein Beteiligungsverhältnis besteht – Restlaufzeit mehr als 1 Jahr"} + 0700: {active=True, shortdesc="Sonstige Vermögensgegenstände", longdesc="Sonstige Vermögensgegenstände oder sonstige Verbindlichkeiten"} + 0701: {active=True, validcc=Local, shortdesc="Sonstige Vermögensgegenstände <1 Jahr", longdesc="Sonstige Vermögensgegenstände – Restlaufzeit bis 1 Jahr"} + 0702: {active=True, validcc=Local, shortdesc="Sonstige Vermögensgegenstände >1 Jahr", longdesc="Sonstige Vermögensgegenstände – Restlaufzeit mehr als 1 Jahr"} + 0705: {active=True, validcc=Local, shortdesc="Geldtransit"} + 0707: {active=True, shortdesc="Forderungen gegen Gesellschafter", longdesc="Forderungen gegen GmbH-Gesellschafter"} + 0708: {active=True, validcc=Local, shortdesc="Forderungen <1 Jahr gegen Gesellschafter", longdesc="Forderungen gegen GmbH-Gesellschafter – Restlaufzeit bis 1 Jahr"} + 0709: {active=True, validcc=Local, shortdesc="Forderungen >1 Jahr gegen GmbH-Gesellschafter", longdesc="Forderungen gegen Gesellschafter – Restlaufzeit mehr als 1 Jahr"} + 0710: {active=True, validcc=Local, shortdesc="Verrechnungskonto für Gewinnermittlung §4/3 EStG", longdesc="Verrechnungskonto für Gewinnermittlung §4 Absatz 3 EStG, nicht ergebniswirksam"} + 0712: {active=True, shortdesc="Forderungen gegen Vorstandsmitglieder und Geschäftsführer"} + 0713: {active=True, validcc=Local, shortdesc="Forderungen <1 Jahr gegen Vorstandsmitglieder und Geschäftsführer", longdesc="Forderungen gegen Vorstandsmitglieder und Geschäftsführer – Restlaufzeit bis 1 Jahr"} + 0714: {active=True, validcc=Local, shortdesc="Forderungen <1 Jahr gegen Vorstandsmitglieder und Geschäftsführer", longdesc="Forderungen gegen Vorstandsmitglieder und Geschäftsführer – Restlaufzeit bis 1 Jahr"} + 0715: {active=True, validcc=Local, shortdesc="Überleitungskonto Kostenstellen"} + 0716: {active=True, type=Liability, debitcredit=credit, validcc=Local, shortdesc="Verrechnungskonto erhaltene Anzahlungen bei Buchung über Debitorenkonto"} + 0717: {active=True, shortdesc="Forderungen gegen sonstige Gesellschafter"} + 0718: {active=True, validcc=Local, shortdesc="Forderungen <1 Jahr gegen sonstige Gesellschafter", longdesc="Forderungen gegen sonstige Gesellschafter – Restlaufzeit bis 1 Jahr"} + 0719: {active=True, validcc=Local, shortdesc="Forderungen >1 Jahr gegen sonstige Gesellschafter", longdesc="Forderungen gegen sonstige Gesellschafter – Restlaufzeit mehr als 1 Jahr"} + 0720: {active=True, validcc=Local, shortdesc="Verrechnungskonto Ist-Versteuerung"} + 0721: {active=True, shortdesc="Forderungen gegen Personal aus Lohn- und Gehaltsabrechnung"} + 0722: {active=True, validcc=Local, shortdesc="Forderungen <1 Jahr gegen Personal aus Lohn- und Gehaltsabrechnung", longdesc="Forderungen gegen Personal aus Lohn- und Gehaltsabrechnung – Restlaufzeit bis 1 Jahr"} + 0723: {active=True, validcc=Local, shortdesc="Forderungen >1 Jahr gegen Personal aus Lohn- und Gehaltsabrechnung", longdesc="Forderungen gegen Personal aus Lohn- und Gehaltsabrechnung – Restlaufzeit mehr als 1 Jahr"} + 0724: {active=True, shortdesc="Kautionen", longdesc="Gezahlte Kautionen"} + 0725: {active=True, validcc=Local, shortdesc="Kautionen <1 Jahr", longdesc="Gezahlte Kautionen – Restlaufzeit bis 1 Jahr"} + 0726: {active=True, validcc=Local, shortdesc="Kautionen >1 Jahr", longdesc="Gezahlte Kautionen – Restlaufzeit mehr als 1 Jahr"} + 0727: {active=True, shortdesc="Darlehen", longdesc="Gewährte Darlehen"} + 0728: {active=True, validcc=Local, shortdesc="Darlehen <1 Jahr", longdesc="Gewährte Darlehen – Restlaufzeit bis 1 Jahr"} + 0729: {active=True, validcc=Local, shortdesc="Darlehen >1 Jahr", longdesc="Gewährte Darlehen – Restlaufzeit mehr als 1 Jahr"} + 0730-0866: {active=True, shortdesc="Umsatzsteuer-Konten", longdesc="Konten mit Umsatzsteuer-Bezug"} + 0730-0742+0761-0820+0849-0857: {active=True, shortdesc="Saldo USt-Konten"} + 0730: {active=True, validcc=Local, shortdesc="Gegenkonto Bruttovorumsatz"} + 0735: {active=True, validcc=Local, shortdesc="Nettoaufwand 7% Vorumsatz"} + 0740: {active=True, validcc=Local, shortdesc="Nettoaufwand 19% Vorumsatz"} + 0741: {active=False, validcc=Local, shortdesc="Nettoaufwand 16% Vorumsatz", longdesc="VERALTET!"} + 0742: {active=False, validcc=Local, shortdesc="reserviert", longdesc="VERALTET!"} + 0761-0785+0810-0820+0849-0857: {active=True, shortdesc="Sonstige Vermögensgegenstände oder sonstige Verbindlichkeiten"} + 0770: {active=True, shortdesc="Abziehbare Vorsteuer"} + 0761: {active=True, validcc=Local, shortdesc="Abziehbare Vorsteuer aus der Auslagerung von Gegenständen aus einem Umsatzsteuerlager"} + 0775: {active=True, validcc=Local, shortdesc="Abziehbare Vorsteuer 7%"} + 0780: {active=True, validcc=Local, shortdesc="Abziehbare Vorsteuer 19%"} + 0781: {active=False, validcc=Local, shortdesc="Abziehbare Vorsteuer 16%", longdesc="VERALTET!"} + 0782: {active=False, validcc=Local, shortdesc="reserviert", longdesc="VERALTET!"} + 0785: {active=True, validcc=Local, shortdesc="Pauschalierte Vorsteuer 7%"} + 0810: {active=True, shortdesc="Abziehbare Vorsteuer aus innergemeinschaftlichem Erwerb"} + 0811: {active=True, validcc=Local, shortdesc="Abziehbare Vorsteuer aus innergemeinschaftlichem Erwerb 19%"} + 0815: {active=True, validcc=Local, shortdesc="Abziehbare Vorsteuer innergemeinschaftlicher Erwerb Neufahrzeuge ohne USt-ID"} + 0820: {active=True, validcc=Local, shortdesc="Gegenkonto Vorsteuer §4/3 EStG", longdesc="Gegenkonto Vorsteuer §4 Absatz 3 EStG"} + 0849: {active=True, shortdesc="Abziehbare Vorsteuer nach §13b UStG"} + 0850: {active=True, validcc=Local, shortdesc="Abziehbare Vorsteuer §13b UStG 19%", longdesc="Abziehbare Vorsteuer nach §13b UStG 19%"} + 0851: {active=False, validcc=Local, shortdesc="Abziehbare Vorsteuer nach §13b UStG 16%", longdesc="VERALTET!"} + 0852: {active=False, validcc=Local, shortdesc="reserviert", longdesc="VERALTET!"} + 0853: {active=True, validcc=Local, shortdesc="Vorsteuer in Folgeperiode abziehbar", longdesc="Vorsteuer in Folgeperiode / im Folgejahr abziehbar"} + 0855: {active=True, validcc=Local, shortdesc="Auflösung Vorsteuer aus Vorjahr §4/3 EStG", longdesc="Auflösung Vorsteuer aus Vorjahr §4 Absatz 3 EStG"} + 0857: {active=True, validcc=Local, shortdesc="Vorsteuer aus Investitionen §4 Abs. 3 EStG", longdesc="Vorsteuer aus Investitionen §4 Absatz 3 EStG"} + 0790-0807: {active=True, shortdesc="Nettoaufwand aus innergemeinschaftlichem Erwerb"} + 0790: {active=True, validcc=Local, shortdesc="Nettoaufwand 7% aus innergemeinschaftlichem Erwerb"} + 0795: {active=True, validcc=Local, shortdesc="Nettoaufwand 19 % aus innergemeinschaftlichem Erwerb"} + 0796-0797: {active=False, validcc=Local, shortdesc="reserviert", longdesc="VERALTET!"} + 0800: {active=True, validcc=Local, shortdesc="Nettoaufwand 7% aus innergemeinschaftlichem Erwerb ohne Vorsteuerabzug"} + 0805: {active=True, validcc=Local, shortdesc="Nettoaufwand 19% aus innergemeinschaftlichem Erwerb ohne Vorsteuerabzug"} + 0806-0807: {active=False, validcc=Local, shortdesc="reserviert", longdesc="VERALTET!"} + 0746: {active=True, shortdesc="Umsatzsteuerforderungen", longdesc="Forderungen aus Umsatzsteuer-Vorauszahlungen"} + 0745: {active=True, validcc=Local, shortdesc="Umsatzsteuerforderungen laufendes Jahr"} + 0747: {active=True, validcc=Local, shortdesc="Umsatzsteuerforderungen Vorjahr"} + 0748: {active=True, validcc=Local, shortdesc="Umsatzsteuerforderungen frühere Jahre"} + 0755-0760: {active=True, shortdesc="Zurückzuzahlende und nachträglich abziehbare Vorsteuer"} + 0755: {active=True, type=Liability, debitcredit=credit, validcc=Local, shortdesc="Zurückzuzahlende Vorsteuer §15a Abs. 1 UStG, unbewegliche Wirtschaftsgüter", longdesc="Zurückzuzahlende Vorsteuer gemäß §15a Absatz 1 UStG, unbewegliche Wirtschaftsgüter"} + 0756: {active=True, type=Liability, debitcredit=credit, validcc=Local, shortdesc="Zurückzuzahlende Vorsteuer §15a Abs. 2 UStG", longdesc="Zurückzuzahlende Vorsteuer, §15a Absatz 2 UStG"} + 0757: {active=True, type=Liability, debitcredit=credit, validcc=Local, shortdesc="Zurückzuzahlende Vorsteuer §15a Abs. 1 UStG, bewegliche Wirtschaftsgüter", longdesc="Zurückzuzahlende Vorsteuer, §15a Absatz 1 UStG, bewegliche Wirtschaftsgüter"} + 0758: {active=True, validcc=Local, shortdesc="Nachträglich abziehbare Vorsteuer §15a Abs. 2 UStG", longdesc="Nachträglich abziehbare Vorsteuer, §15a Absatz 2 UStG"} + 0759: {active=True, validcc=Local, shortdesc="Nachträglich abziehbare Vorsteuer §15a Abs. 1 UStG, unbewegliche Wirtschaftsgüter", longdesc="Nachträglich abziehbare Vorsteuer gemäß §15a Absatz 1 UStG, unbewegliche Wirtschaftsgüter"} + 0760: {active=True, validcc=Local, shortdesc="Nachträglich abziehbare Vorsteuer §15a Abs. 1 UStG, bewegliche Wirtschaftsgüter", longdesc="Nachträglich abziehbare Vorsteuer, §15a Absatz 1 UStG, bewegliche Wirtschaftsgüter"} + 0825: {active=True, shortdesc="Aufzuteilende Vorsteuer"} + 0830: {active=True, validcc=Local, shortdesc="Aufzuteilende Vorsteuer 7%"} + 0835: {active=True, validcc=Local, shortdesc="Aufzuteilende Vorsteuer 19%"} + 0836: {active=False, validcc=Local, shortdesc="Aufzuteilende Vorsteuer 16%", longdesc="VERALTET!"} + 0837: {active=False, validcc=Local, shortdesc="reserviert", longdesc="VERALTET!"} + 0839: {active=True, shortdesc="Aufzuteilende Vorsteuer §§ 13a/b UStG", longdesc="Aufzuteilende Vorsteuer nach §§ 13a & 13b UStG"} + 0838: {active=True, validcc=Local, shortdesc="Aufzuteilende Vorsteuer 19% nach §§ 13a/b UStG", longdesc="Aufzuteilende Vorsteuer nach §§ 13a & 13b UStG 19%"} + 0840: {active=True, shortdesc="Aufzuteilende Vorsteuer aus innergemeinschaftlichem Erwerb"} + 0844: {active=True, validcc=Local, shortdesc="Aufzuteilende Vorsteuer 19% aus innergemeinschaftlichem Erwerb", longdesc="Aufzuteilende Vorsteuer aus innergemeinschaftlichem Erwerb 19%"} + 0841: {active=True, validcc=Local, shortdesc="Aufzuteilende Vorsteuer Anlagevermögen"} + 0845: {active=True, validcc=Local, shortdesc="Aufzuteilende Vorsteuer Ausgaben Bereich 4000-8000"} + 0859: {active=True, validcc=Local, shortdesc="Gegenkonto für Vorsteuer nach Durchschnittssätzen", longdesc="Gegenkonto für Vorsteuer nach Durchschnittssätzen für §4 Absatz 3 EStG"} + 0860: {active=True, validcc=Local, shortdesc="Entstandene Einfuhrumsatzsteuer"} + 0865: {active=True, validcc=Local, shortdesc="Vorsteuer nach allgemeinen Durchschnittssätzen", longdesc="Vorsteuer nach allgemeinen Durchschnittssätzen UStVA Kz. 63"} + 0866: {active=True, validcc=Local, shortdesc="Vorsteuer aus Erwerb als letzter Abnehmer innerhalb eines Dreiecksgeschäfts"} + 0867: {active=True, shortdesc="Forderungen gegen typisch stille Gesellschafter"} + 0868: {active=True, validcc=Local, shortdesc="Forderungen <1 Jahr gegen typisch stille Gesellschafter", longdesc="Forderungen gegen typisch stille Gesellschafter – Restlaufzeit bis 1 Jahr"} + 0869: {active=True, validcc=Local, shortdesc="Forderungen >1 Jahr gegen typisch stille Gesellschafter", longdesc="Forderungen gegen typisch stille Gesellschafter – Restlaufzeit mehr als 1 Jahr"} + 0870: {active=True, validcc=Local, shortdesc="Durchlaufende Posten Einnahmen"} + 0875: {active=True, validcc=Local, shortdesc="Durchlaufende Posten Ausgaben"} + 0877-0883: {active=True, shortdesc="Sonstige Forderungen an Finazämter & BA", longdesc="Sonstige Forderungen an Finazämter und Bundesagentur für Arbeit"} + 0877: {active=True, validcc=Local, shortdesc="Steuererstattungsansprüche gegenüber anderen Ländern"} + 0878: {active=True, shortdesc="Körperschaftsteuerrückforderung"} + 0879: {active=False, validcc=Local, shortdesc="Körperschaftsteuerguthaben nach §37 KStG <1 Jahr", longdesc="VERALTET!"} + 0880: {active=False, validcc=Local, shortdesc="Körperschaftsteuerguthaben nach §37 KStG >1 Jahr", longdesc="VERALTET!"} + 0881: {active=True, validcc=Local, shortdesc="Forderungen an das Finanzamt aus abgeführtem Bauabzugsbetrag"} + 0882: {active=True, validcc=Local, shortdesc="Forderungen Bundesagentur für Arbeit", longdesc="Forderungen gegenüber der Bundesagentur für Arbeit"} + 0883: {active=True, validcc=Local, shortdesc="Forderungen aus Gewerbesteuerüberzahlungen"} + 0885: {active=True, validcc=Local, shortdesc="Sammelkonto aufzuteilende Ausgaben"} + 0890: {active=True, validcc=Local, shortdesc="Sammelkonto aufzuteilende Einnahmen"} + 0895-0899: {active=True, shortdesc="Forderungen aus Lieferungen und Leistungen (EÜR)", longdesc="Forderungen aus Lieferungen und Leistungen (Einnahmenüberschußrechnung)"} + 0895: {active=True, validcc=Local, shortdesc="Forderungen aus Lieferungen und Leistungen zum allgemeinen Umsatzsteuersatz oder eines Kleinunternehmers", longdesc="Forderungen aus Lieferungen und Leistungen zum allgemeinen Umsatzsteuersatz oder eines Kleinunternehmers (EÜR)"} + 0896: {active=True, validcc=Local, shortdesc="Forderungen aus Lieferungen und Leistungen zum ermäßigten Umsatzsteuersatz", longdesc="Forderungen aus Lieferungen und Leistungen zum ermäßigten Umsatzsteuersatz (EÜR)"} + 0897: {active=True, validcc=Local, shortdesc="Forderungen aus steuerfreien oder nicht steuerbaren Lieferungen und Leistungen", longdesc="Forderungen aus steuerfreien oder nicht steuerbaren Lieferungen und Leistungen (EÜR)"} + 0898: {active=True, validcc=Local, shortdesc="Forderungen aus Lieferungen und Leistungen nach Durchschnittssätzen gemäß §24 UStG", longdesc="Forderungen aus Lieferungen und Leistungen nach Durchschnittssätzen gemäß §24 UStG (EÜR)"} + 0899: {active=True, validcc=Local, shortdesc="Gegenkonto 0895-0898 bei Aufteilung der Forderungen nach Steuersätzen", longdesc="Gegenkonto 0895-0898 bei Aufteilung der Forderungen nach Steuersätzen (EÜR)"} + 0900-0919: {active=True, shortdesc="Wertpapiere"} + 0900: {active=True, validcc=Local, shortdesc="Anteile an verbundenen Unternehmen"} + 0905: {active=True, validcc=Local, shortdesc="Eigene Anteile"} + 0910-0919: {active=True, shortdesc="Sonstige Wertpapiere"} + 0910: {active=True, validcc=Local, shortdesc="Finanzwechsel"} + 0915: {active=True, validcc=Local, shortdesc="Sonstige Wertpapiere"} + 0920-0960: {active=True, shortdesc="Kasse, Bank", longdesc="Barkassen & Bankkonten"} + 0920: {active=True, shortdesc="Kasse", bankaccount=true} + 0925: {active=True, validcc=Local, shortdesc="Hauptkasse", bankaccount=true} + 0930: {active=True, validcc=Local, shortdesc="Nebenkasse 1", bankaccount=true} + 0935: {active=True, validcc=Local, shortdesc="Nebenkasse 2", bankaccount=true} + 0940-0960: {active=True, shortdesc="Bank", longdesc="Bankkonten und Schecks", bankaccount=true} + 0940: {active=True, validcc=Local, shortdesc="Bank", longdesc="Postbank", bankaccount=true} + 0945: {active=True, validcc=Local, shortdesc="Bank", bankaccount=true} + 0950: {active=True, validcc=Local, shortdesc="Bank 1", bankaccount=true} + 0955: {active=True, validcc=Local, shortdesc="Bank 2", bankaccount=true} + 0960: {active=True, validcc=Local, shortdesc="Schecks"} + 0990: {active=True, validcc=Local, shortdesc="AKTIVE RECHNUNGSABGRENZUNGSPOSTEN", longdesc="Rechnungsabgrenzungsposten aktiv"} + 1: {active=True, type=Liability, debitcredit=credit, validcc=All, shortdesc="passive Vermögensposten", longdesc="Bestandskonten Passiva"} + 1000-1179: {active=True, shortdesc="VERMÖGEN / EIGENKAPITAL", longdesc="Vermögen, Eigenkapital"} + 1000-1079: {active=True, shortdesc="Gewinnrücklagen"} + 1000-1069: {active=True, shortdesc="Gebundene Rücklagen"} + 1000: {active=True, validcc=Local, shortdesc="Gebundene Rücklagen §58 Nr. 6 AO", longdesc="Gebundene Rücklagen §58 Nummer 6 Abgabenordnung"} + 1002: {active=True, validcc=Local, shortdesc="Betriebsmittelrücklage"} + 1004: {active=True, validcc=Local, shortdesc="Wiederbeschaffungsrücklage §62 Abs. 1 Nr. 2 AO", longdesc="Wiederbeschaffungsrücklage gemäß §62 Absatz 1 Nummer 2 Abgabenordnung"} + 1010-1019: {active=True, shortdesc="Rücklagen ideeller Bereich"} + 1010: {active=True, validcc=Local, shortdesc="Rücklagen ideeller Bereich bis 2020"} + 1011: {active=True, validcc=Local, shortdesc="Rücklagen ideeller Bereich bis 2021"} + 1012: {active=True, validcc=Local, shortdesc="Rücklagen ideeller Bereich bis 2022"} + 1013: {active=True, validcc=Local, shortdesc="Rücklagen ideeller Bereich bis 2023"} + 1014: {active=True, validcc=Local, shortdesc="Rücklagen ideeller Bereich bis 2024"} + 1015: {active=True, validcc=Local, shortdesc="Rücklagen ideeller Bereich bis 2025"} + 1016: {active=True, validcc=Local, shortdesc="Rücklagen ideeller Bereich bis 2016"} + 1017: {active=True, validcc=Local, shortdesc="Rücklagen ideeller Bereich bis 2017"} + 1018: {active=True, validcc=Local, shortdesc="Rücklagen ideeller Bereich bis 2018"} + 1019: {active=True, validcc=Local, shortdesc="Rücklagen ideeller Bereich bis 2019"} + 1020-1029: {active=True, shortdesc="Rücklagen Vermögensverwaltung"} + 1020: {active=True, validcc=Local, shortdesc="Rücklagen Vermögensverwaltung bis 2020"} + 1021: {active=True, validcc=Local, shortdesc="Rücklagen Vermögensverwaltung bis 2021"} + 1022: {active=True, validcc=Local, shortdesc="Rücklagen Vermögensverwaltung bis 2022"} + 1023: {active=True, validcc=Local, shortdesc="Rücklagen Vermögensverwaltung bis 2023"} + 1024: {active=True, validcc=Local, shortdesc="Rücklagen Vermögensverwaltung bis 2024"} + 1025: {active=True, validcc=Local, shortdesc="Rücklagen Vermögensverwaltung bis 2025"} + 1026: {active=True, validcc=Local, shortdesc="Rücklagen Vermögensverwaltung bis 2016"} + 1027: {active=True, validcc=Local, shortdesc="Rücklagen Vermögensverwaltung bis 2017"} + 1028: {active=True, validcc=Local, shortdesc="Rücklagen Vermögensverwaltung bis 2018"} + 1029: {active=True, validcc=Local, shortdesc="Rücklagen Vermögensverwaltung bis 2019"} + 1030-1039: {active=True, shortdesc="Rücklagen Zweckbetriebe"} + 1030: {active=True, validcc=Local, shortdesc="Rücklagen Zweckbetriebe bis 2020"} + 1031: {active=True, validcc=Local, shortdesc="Rücklagen Zweckbetriebe bis 2021"} + 1032: {active=True, validcc=Local, shortdesc="Rücklagen Zweckbetriebe bis 2022"} + 1033: {active=True, validcc=Local, shortdesc="Rücklagen Zweckbetriebe bis 2023"} + 1034: {active=True, validcc=Local, shortdesc="Rücklagen Zweckbetriebe bis 2024"} + 1035: {active=True, validcc=Local, shortdesc="Rücklagen Zweckbetriebe bis 2025"} + 1036: {active=True, validcc=Local, shortdesc="Rücklagen Zweckbetriebe bis 2016"} + 1037: {active=True, validcc=Local, shortdesc="Rücklagen Zweckbetriebe bis 2017"} + 1038: {active=True, validcc=Local, shortdesc="Rücklagen Zweckbetriebe bis 2018"} + 1039: {active=True, validcc=Local, shortdesc="Rücklagen Zweckbetriebe bis 2019"} + 1040-1049: {active=True, shortdesc="Rücklagen Geschäftsbetriebe"} + 1040: {active=True, validcc=Local, shortdesc="Rücklagen Geschäftsbetriebe bis 2020"} + 1041: {active=True, validcc=Local, shortdesc="Rücklagen Geschäftsbetriebe bis 2021"} + 1042: {active=True, validcc=Local, shortdesc="Rücklagen Geschäftsbetriebe bis 2022"} + 1043: {active=True, validcc=Local, shortdesc="Rücklagen Geschäftsbetriebe bis 2023"} + 1044: {active=True, validcc=Local, shortdesc="Rücklagen Geschäftsbetriebe bis 2024"} + 1045: {active=True, validcc=Local, shortdesc="Rücklagen Geschäftsbetriebe bis 2025"} + 1046: {active=True, validcc=Local, shortdesc="Rücklagen Geschäftsbetriebe bis 2016"} + 1047: {active=True, validcc=Local, shortdesc="Rücklagen Geschäftsbetriebe bis 2017"} + 1048: {active=True, validcc=Local, shortdesc="Rücklagen Geschäftsbetriebe bis 2018"} + 1049: {active=True, validcc=Local, shortdesc="Rücklagen Geschäftsbetriebe bis 2019"} + 1070-1074: {active=True, shortdesc="Freie Rücklagen"} + 1070: {active=True, validcc=Local, shortdesc="Freie Rücklage §62 Abs. 1 Nr. 3 AO", longdesc="Freie Rücklage gemäß §62 Absatz 1 Nummer 3 Abgabenordnung"} + 1074: {active=True, validcc=Local, shortdesc="Rücklage aus Vermögensverwaltung"} + 1075-1079: {active=True, shortdesc="Sonstige Rücklagen"} + 1075: {active=True, validcc=Local, shortdesc="Rücklage aus sonstigen zeitnah zu verwendenden Mitteln"} + 1076: {active=True, validcc=Local, shortdesc="Rücklage zum Erwerb von Gesellschaftsrechten §62 Abs. 1 Nr. 4 AO", longdesc="Rücklage zum Erwerb von Gesellschaftsrechten gemäß §62 Absatz 1 Nummer 4 Abgabenordnung"} + 1080-1090: {active=True, shortdesc="Ergebnisvorträge"} + 1080: {active=True, validcc=Local, shortdesc="Ergebnisvorträge allgemein"} + 1082: {active=True, validcc=Local, shortdesc="Vortrag ideeller Bereich"} + 1084: {active=True, validcc=Local, shortdesc="Vortrag Vermögensverwaltung"} + 1085: {active=True, validcc=Local, shortdesc="Vortrag Zweckbetriebe Sport"} + 1086: {active=True, validcc=Local, shortdesc="Vortrag sonstige Zweckbetriebe"} + 1087: {active=True, validcc=Local, shortdesc="Vortrag Geschäftsbetriebe Sport"} + 1088: {active=True, validcc=Local, shortdesc="Vortrag sonstige Geschäftsbetriebe"} + 1090: {active=True, validcc=Local, shortdesc="Nutzungsgebundenes Kapital", longdesc="Nutzungsgebundenes Kapital (Eigenkapitalausweis)"} + 1100-1125: {active=True, shortdesc="Stiftungsvermögen"} + 1100-1105: {active=True, shortdesc="Stiftungskapital"} + 1100-1103: {active=True, shortdesc="Grundstockvermögen"} + 1100: {active=True, validcc=Local, shortdesc="Errichtungskapital"} + 1103: {active=True, validcc=Local, shortdesc="Zustiftungskapital", longdesc="Zustiftungen"} + 1105: {active=True, validcc=Local, shortdesc="Zuführung aus Ergebnisrücklagen"} + 1110: {active=True, validcc=Local, shortdesc="Umschichtungsergebnisse", longdesc="Ergebnisse Vermögensumschichtung"} + 1115-1125: {active=True, shortdesc="Ergebnisrücklagen"} + 1115: {active=True, validcc=Local, shortdesc="Kapitalerhaltungsrücklage"} + 1118: {active=True, validcc=Local, shortdesc="Ansparrücklage §62 Abs. 4 AO", longdesc="Ansparrücklage §62 Absatz 4 Abgabenordnung"} + 1120: {active=True, validcc=Local, shortdesc="Sonstige Ergebnisrücklagen"} + 1125: {active=True, validcc=Local, shortdesc="Mittelvortrag", longdesc="Ergebnisvortrag"} + 1140-1144: {active=True, shortdesc="Gezeichnetes Kapital", longdesc="Gezeichnetes Kapital einsxhließlich nicth eingeforderter ausstehender Einlagen"} + 1140: {active=True, validcc=Local, shortdesc="Gezeichnetes Kapital"} + 1144: {active=True, validcc=Local, shortdesc="Nicht eingeforderte ausstehende Einlagen", longdesc="Ausstehende Einlagen auf das gezeichnete Kapital, nicht eingefordert"} + 1145-1149: {active=True, shortdesc="Kapitalrücklagen", longdesc="Kapitalrücklagen und Nachschusskapital"} + 1145: {active=True, validcc=Local, shortdesc="Kapitalrücklage"} + 1149: {active=True, validcc=Local, shortdesc="Nachschusskapital"} + 1150-1159: {active=True, shortdesc="Gewinnrücklagen"} + 1150: {active=True, validcc=Local, shortdesc="Gesetzliche Rücklage"} + 1153: {active=True, validcc=Local, shortdesc="Rücklage für eigene Anteile"} + 1155: {active=True, validcc=Local, shortdesc="Satzungsmäßige Rücklagen"} + 1158: {active=True, validcc=Local, shortdesc="Andere Gewinnrücklagen"} + 1160+1170: {active=True, shortdesc="Jahresüberschuss / -Fehlbetrag", longdesc="Jahresüberschuss oder Jahresfehlbetrag"} + 1160: {active=True, validcc=Local, shortdesc="Jahresergebnis", longdesc="Gewinn- oder Verlustvortrag"} + 1170: {active=True, validcc=Local, shortdesc="Vereinskapital / sonstige nicht zeitnah zuverwendende Mittel", longdesc="Vereinskapital oder sonstige nicht zeitnah zuverwendende Mittel"} + 1180-1199: {active=True, shortdesc="SONDERPOSTEN", longdesc="Sonderposten"} + 1180: {active=True, validcc=Local, shortdesc="Sonderposten mit Rücklageanteil"} + 1185: {active=True, validcc=Local, shortdesc="Nutzungsgebundenes Kapital"} + 1190: {active=True, validcc=Local, shortdesc="Längerfristig gebundene Spenden"} + 1195: {active=True, validcc=Local, shortdesc="Noch nicht satzungsgemäß verwendete Spenden"} + 1200-1229: {active=True, shortdesc="RÜCKSTELLUNGEN", longdesc="Rückstellungen"} + 1200: {active=True, validcc=Local, shortdesc="Pensionsrückstellungen", longdesc="Rückstellungen für Pensionen und ähnliche Verpflichtungen"} + 1210: {active=True, validcc=Local, shortdesc="Steuerrückstellungen"} + 1220: {active=True, validcc=Local, shortdesc="Sonstige Rückstellungen"} + 1230+1235: {active=True, shortdesc="FÖRDERUNGSVERPFLICHTUNGEN", longdesc="Förderungsverpflichtungen"} + 1230: {active=True, validcc=Local, shortdesc="Bewilligungen"} + 1235: {active=True, type=Asset, debitcredit=debit, validcc=Local, shortdesc="Rückgängig gemachte Bewilligungen"} + 1300-1989: {active=True, shortdesc="VERBINDLICHKEITEN", longdesc="Verbindlichkeiten, sonstige Vermögensgegenstände"} + 1300-1318: {active=True, shortdesc="Anleihen"} + 1300: {active=True, shortdesc="Anleihen, nicht konvertibel", longdesc="Nicht konvertible Anleihen"} + 1301: {active=True, validcc=Local, shortdesc="Anleihen <1 Jahr, nicht konvertibel", longdesc="Nicht konvertible Anleihen – Restlaufzeit bis 1 Jahr"} + 1302: {active=True, validcc=Local, shortdesc="Anleihen 1–5 Jahre, nicht konvertibel", longdesc="Nicht konvertible Anleihen – Restlaufzeit 1 bis 5 Jahre"} + 1303: {active=True, validcc=Local, shortdesc="Anleihen >5 Jahre, nicht konvertibel", longdesc="Nicht konvertible Anleihen – Restlaufzeit mehr als 5 Jahre"} + 1315: {active=True, shortdesc="Anleihen, konvertibel", longdesc="Konvertible Anleihen"} + 1316: {active=True, validcc=Local, shortdesc="Anleihen <1 Jahr, konvertibel", longdesc="Konvertible Anleihen – Restlaufzeit bis 1 Jahr"} + 1317: {active=True, validcc=Local, shortdesc="Anleihen 1–5, Jahre konvertibel", longdesc="Konvertible Anleihen – Restlaufzeit 1 bis 5 Jahre"} + 1318: {active=True, validcc=Local, shortdesc="Anleihen >5 Jahre, konvertibel", longdesc="Konvertible Anleihen – Restlaufzeit mehr als 5 Jahre"} + 1320: {active=False, validcc=Local, shortdesc="Verbindlichkeiten gegenüber Kreditinstituten", longdesc="VERALTET!"} + 1330: {active=True, shortdesc="Erhaltene Anzahlungen auf Bestellungen"} + 1331: {active=True, validcc=Local, shortdesc="Erhaltene Anzahlungen auf Bestellungen <1 Jahr", longdesc="Erhaltene Anzahlungen auf Bestellungen – Restlaufzeit bis 1 Jahr"} + 1332: {active=True, validcc=Local, shortdesc="Erhaltene Anzahlungen auf Bestellungen 1–5 Jahre", longdesc="Erhaltene Anzahlungen auf Bestellungen – Restlaufzeit 1 bis 5 Jahre"} + 1333: {active=True, validcc=Local, shortdesc="Erhaltene Anzahlungen auf Bestellungen >5 Jahre", longdesc="Erhaltene Anzahlungen auf Bestellungen – Restlaufzeit mehr als 5 Jahre"} + 1335-1349: {active=True, shortdesc="Verbindlichkeiten aus L&L", longdesc="Verbindlichkeiten aus Lieferungen und Leistungen oder sonstige Vermögensgegenstände"} + 1335: {active=True, shortdesc="Verbindlichkeiten aus L&L gegenüber Gesellschaftern", longdesc="Verbindlichkeiten aus Lieferungen und Leistungen gegenüber Gesellschaftern"} + 1336: {active=True, validcc=Local, shortdesc="Verbindlichkeiten <1 Jahr aus L&L gegenüber Gesellschaftern", longdesc="Verbindlichkeiten aus Lieferungen und Leistungen gegenüber Gesellschaftern – Restlaufzeit bis 1 Jahr"} + 1337: {active=True, validcc=Local, shortdesc="Verbindlichkeiten 1–5 Jahre aus L&L gegenüber Gesellschaftern", longdesc="Verbindlichkeiten aus Lieferungen und Leistungen gegenüber Gesellschaftern – Restlaufzeit 1 bis 5 Jahre"} + 1338: {active=True, validcc=Local, shortdesc="Verbindlichkeiten >5 Jahre aus L&L gegenüber Gesellschaftern", longdesc="Verbindlichkeiten aus Lieferungen und Leistungen gegenüber Gesellschaftern – Restlaufzeit mehr als 5 Jahre"} + 1339: {active=True, validcc=Local, shortdesc="Gegenkonto 1335-1338, 1347-1349, 1365-1369, 1375-1379 bei Aufteilung Kreditorenkonto"} + 1340: {active=True, shortdesc="Verbindlichkeiten aus L&L", longdesc="Verbindlichkeiten aus Lieferungen und Leistungen"} + 1341: {active=True, validcc=Local, shortdesc="Verbindlichkeiten aus L&L zum allgemeinen Umsatzsteuersatz", longdesc="Verbindlichkeiten aus Lieferungen und Leistungen zum allgemeinen Umsatzsteuersatz (EÜR)"} + 1342: {active=True, validcc=Local, shortdesc="Verbindlichkeiten aus L&L zum ermäßigten Umsatzsteuersatz", longdesc="Verbindlichkeiten aus Lieferungen und Leistungen zum ermäßigten Umsatzsteuersatz (EÜR)"} + 1343: {active=True, validcc=Local, shortdesc="Verbindlichkeiten aus L&L ohne Vorsteuerabzug", longdesc="Verbindlichkeiten aus Lieferungen und Leistungen ohne Vorsteuerabzug (EÜR)"} + 1344: {active=True, validcc=Local, shortdesc="Gegenkonto 1341-1343 bei Aufteilung der Verbindlichkeiten nach Steuersätzen", longdesc="Gegenkonto 1341-1343 bei Aufteilung der Verbindlichkeiten nach Steuersätzen (EÜR)"} + 1345: {active=True, validcc=Local, shortdesc="Verbindlichkeiten Investitionen §4/3 EStG", longdesc="Verbindlichkeiten Investitionen §4 Absatz 3 EStG"} + 1346: {active=True, shortdesc="Verbindlichkeiten aus L&L ohne Kontokorrent", longdesc="Verbindlichkeiten aus Lieferungen und Leistungen ohne Kontokorrent"} + 1347: {active=True, validcc=Local, shortdesc="Verbindlichkeiten <1 Jahr aus L&L ohne Kontokorrent", longdesc="Verbindlichkeiten aus Lieferungen und Leistungen ohne Kontokorrent – Restlaufzeit bis 1 Jahr"} + 1348: {active=True, validcc=Local, shortdesc="Verbindlichkeiten 1–5 Jahre aus L&L ohne Kontokorrent", longdesc="Verbindlichkeiten aus Lieferungen und Leistungen ohne Kontokorrent – Restlaufzeit 1 bis 5 Jahre"} + 1349: {active=True, validcc=Local, shortdesc="Verbindlichkeiten >5 Jahre aus L&L ohne Kontokorrent", longdesc="Verbindlichkeiten aus Lieferungen und Leistungen ohne Kontokorrent – Restlaufzeit mehr als 5 Jahre"} + 1350: {active=True, shortdesc="Wechselverbindlichkeiten", longdesc="Verbindlichkeiten aus Wechseln"} + 1351: {active=True, validcc=Local, shortdesc="Wechselverbindlichkeiten <1 Jahr", longdesc="Verbindlichkeiten aus Wechseln – Restlaufzeit bis 1 Jahr"} + 1352: {active=True, validcc=Local, shortdesc="Wechselverbindlichkeiten 1–5 Jahre", longdesc="Verbindlichkeiten aus Wechseln – Restlaufzeit 1 bis 5 Jahre"} + 1353: {active=True, validcc=Local, shortdesc="Wechselverbindlichkeiten >5 Jahre", longdesc="Verbindlichkeiten aus Wechseln – Restlaufzeit mehr als 5 Jahre"} + 1360: {active=True, shortdesc="Verbindlichkeiten gegenüber verbundenen Unternehmen", longdesc="Verbindlichkeiten oder Forderungen gegen(über) verbundene(n) Unternehmen"} + 1361: {active=True, validcc=Local, shortdesc="Verbindlichkeiten <1 Jahr gegenüber verbundenen Unternehmen", longdesc="Verbindlichkeiten gegenüber verbundenen Unternehmen – Restlaufzeit bis 1 Jahr"} + 1362: {active=True, validcc=Local, shortdesc="Verbindlichkeiten 1–5 Jahre gegenüber verbundenen Unternehmen", longdesc="Verbindlichkeiten gegenüber verbundenen Unternehmen – Restlaufzeit 1 bis 5 Jahre"} + 1363: {active=True, validcc=Local, shortdesc="Verbindlichkeiten >5 Jahre gegenüber verbundenen Unternehmen", longdesc="Verbindlichkeiten gegenüber verbundenen Unternehmen – Restlaufzeit mehr als 5 Jahre"} + 1365: {active=True, shortdesc="Verbindlichkeiten aus L&L gegenüber verbundenen Unternehmen", longdesc="Verbindlichkeiten aus Lieferungen und Leistungen gegenüber verbundenen Unternehmen"} + 1366: {active=True, validcc=Local, shortdesc="Verbindlichkeiten <1 Jahr aus Lieferungen und Leistungen gegenüber verbundenen Unternehmen", longdesc="Verbindlichkeiten aus Lieferungen und Leistungen gegenüber verbundenen Unternehmen – Restlaufzeit bis 1 Jahr"} + 1367: {active=True, validcc=Local, shortdesc="Verbindlichkeiten 1–5 Jahre aus Lieferungen und Leistungen gegenüber verbundenen Unternehmen", longdesc="Verbindlichkeiten aus Lieferungen und Leistungen gegenüber verbundenen Unternehmen – Restlaufzeit 1 bis 5 Jahre"} + 1368: {active=True, validcc=Local, shortdesc="Verbindlichkeiten >5 Jahre aus Lieferungen und Leistungen gegenüber verbundenen Unternehmen", longdesc="Verbindlichkeiten aus Lieferungen und Leistungen gegenüber verbundenen Unternehmen – Restlaufzeit mehr als 5 Jahre"} + 1370: {active=True, shortdesc="Verbindlichkeiten gegenüber Unternehmen mit Beteiligungsverhältnis", longdesc="Verbindlichkeiten oder Forderungen gegenüber Unternehmen, mit denen ein Beteiligungsverhältnis besteht"} + 1371: {active=True, validcc=Local, shortdesc="Verbindlichkeiten <1 Jahr gegenüber Unternehmen mit Beteiligungsverhältnis", longdesc="Verbindlichkeiten gegenüber Unternehmen mit Beteiligungsverhältnis – Restlaufzeit bis 1 Jahr"} + 1372: {active=True, validcc=Local, shortdesc="Verbindlichkeiten 1–5 Jahre gegenüber Unternehmen mit Beteiligungsverhältnis", longdesc="Verbindlichkeiten gegenüber Unternehmen mit Beteiligungsverhältnis – Restlaufzeit 1 bis 5 Jahre"} + 1373: {active=True, validcc=Local, shortdesc="Verbindlichkeiten >5 Jahre gegenüber Unternehmen mit Beteiligungsverhältnis", longdesc="Verbindlichkeiten gegenüber Unternehmen mit Beteiligungsverhältnis – Restlaufzeit mehr als 5 Jahre"} + 1375: {active=True, shortdesc="Verbindlichkeiten aus L&L gegenüber Unternehmen mit Beteiligungsverhältnis", longdesc="Verbindlichkeiten aus Lieferungen und Leistungen gegenüber Unternehmen, mit denen ein Beteiligungsverhältnis besteht"} + 1376: {active=True, validcc=Local, shortdesc="Verbindlichkeiten <1 Jahr aus Lieferungen und Leistungen gegenüber Unternehmen mit Beteiligungsverhältnis", longdesc="Verbindlichkeiten aus Lieferungen und Leistungen gegenüber Unternehmen mit Beteiligungsverhältnis – Restlaufzeit bis 1 Jahr"} + 1377: {active=True, validcc=Local, shortdesc="Verbindlichkeiten 1–5 Jahre aus Lieferungen und Leistungen gegenüber Unternehmen mit Beteiligungsverhältnis", longdesc="Verbindlichkeiten aus Lieferungen und Leistungen gegenüber Unternehmen mit Beteiligungsverhältnis – Restlaufzeit 1 bis 5 Jahre"} + 1378: {active=True, validcc=Local, shortdesc="Verbindlichkeiten >5 Jahre aus Lieferungen und Leistungen gegenüber Unternehmen mit Beteiligungsverhältnis", longdesc="Verbindlichkeiten aus Lieferungen und Leistungen gegenüber Unternehmen mit Beteiligungsverhältnis – Restlaufzeit mehr als 5 Jahre"} + 1380: {active=True, validcc=Local, shortdesc="Verbindlichkeiten für satzungsgemäße Leistungen"} + 1385: {active=True, validcc=Local, shortdesc="Verbindlichkeiten aus erteilten Zusagen"} + 1390: {active=True, validcc=Local, shortdesc="Verbindlichkeiten aus nicht zweckentsprechend verwendeten Mitteln"} + 1395: {active=True, validcc=Local, shortdesc="Verbindlichkeiten aus bedingt rückzahlungspflichtigen Spenden"} + 1500: {active=True, shortdesc="Verbindlichkeiten gegenüber Kreditinstituten", longdesc="Verbindlichkeiten gegenüber Kreditinstituten oder Kasse, Bank"} + 1501: {active=True, validcc=Local, shortdesc="Verbindlichkeiten <1 Jahr gegenüber Kreditinstituten", longdesc="Verbindlichkeiten gegenüber Kreditinstituten – Restlaufzeit bis 1 Jahr"} + 1502: {active=True, validcc=Local, shortdesc="Verbindlichkeiten 1–5 Jahre gegenüber Kreditinstituten", longdesc="Verbindlichkeiten gegenüber Kreditinstituten – Restlaufzeit 1 bis 5 Jahre"} + 1503: {active=True, validcc=Local, shortdesc="Verbindlichkeiten >5 Jahre gegenüber Kreditinstituten", longdesc="Verbindlichkeiten gegenüber Kreditinstituten – Restlaufzeit mehr als 5 Jahre"} + 1540: {active=True, shortdesc="Verbindlichkeiten gegenüber Kreditinstituten aus Teilzahlungsverträgen"} + 1541: {active=True, validcc=Local, shortdesc="Verbindlichkeiten <1 Jahr gegenüber Kreditinstituten aus Teilzahlungsverträgen", longdesc="Verbindlichkeiten gegenüber Kreditinstituten aus Teilzahlungsverträgen – Restlaufzeit bis 1 Jahr"} + 1542: {active=True, validcc=Local, shortdesc="Verbindlichkeiten 1–5 Jahre gegenüber Kreditinstituten aus Teilzahlungsverträgen", longdesc="Verbindlichkeiten gegenüber Kreditinstituten aus Teilzahlungsverträgen – Restlaufzeit 1 bis 5 Jahre"} + 1543: {active=True, validcc=Local, shortdesc="Verbindlichkeiten >5 Jahre gegenüber Kreditinstituten aus Teilzahlungsverträgen", longdesc="Verbindlichkeiten gegenüber Kreditinstituten aus Teilzahlungsverträgen – Restlaufzeit mehr als 5 Jahre"} + 1575-1598: {active=True, validcc=Local, shortdesc="Verbindlichkeiten gegenüber Kreditinstituten ohne Restlaufzeitvermerk", longdesc="Verbindlichkeiten gegenüber Kreditinstituten, frei, in Bilanz kein Restlaufzeitvermerk"} + 1599: {active=True, validcc=Local, shortdesc="Gegenkonto 1500-1574 bei Aufteilung der Konten 1575-1598"} + 1600-1989: {active=True, shortdesc="Sonstige Verbindlichkeiten oder sonstige Vermögensgegenstände"} + 1600: {active=True, shortdesc="Verbindlichkeiten gegenüber Gesellschaftern"} + 1601: {active=True, validcc=Local, shortdesc="Verbindlichkeiten <1 Jahr gegenüber Gesellschaftern", longdesc="Verbindlichkeiten gegenüber Gesellschaftern – Restlaufzeit bis 1 Jahr"} + 1602: {active=True, validcc=Local, shortdesc="Verbindlichkeiten 1–5 Jahre gegenüber Gesellschaftern", longdesc="Verbindlichkeiten gegenüber Gesellschaftern – Restlaufzeit 1 bis 5 Jahre"} + 1603: {active=True, validcc=Local, shortdesc="Verbindlichkeiten >5 Jahre gegenüber Gesellschaftern", longdesc="Verbindlichkeiten gegenüber Gesellschaftern – Restlaufzeit mehr als 5 Jahre"} + 1605: {active=True, validcc=Local, shortdesc="Verbindlichkeiten gegenüber Gesellschaftern für offene Ausschüttungen"} + 1610: {active=True, shortdesc="Darlehen typisch stiller Gesellschafter"} + 1611: {active=True, validcc=Local, shortdesc="Darlehen +// Timotheus Pokorra // Christopher Jäkel // // Copyright 2017-2018 by TBits.net +// Copyright 2020-2021 by SolidCharity.com // // This file is part of OpenPetra. // diff --git a/js-client/src/lib/utils.js b/js-client/src/lib/utils.js index ca274776ee..0eea770014 100644 --- a/js-client/src/lib/utils.js +++ b/js-client/src/lib/utils.js @@ -139,6 +139,9 @@ function display_error(VerificationResult, LanguageNamespace = '', generalerror } else if (error.code != "" && i18next.t(error.code) != error.code) { errormsg += i18next.t(error.code) + "
"; } else { + if (error.message.length > "base64".length && error.message.substr(0,"base64".length) == "base64") { + error.message = atob(error.message.substr("base64".length)).replace("\n", "
"); + } errormsg += error.message + "
"; } } From 877da1dd71c176c15f663e7d4cc83c35d47f9e85 Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Sat, 5 Jun 2021 07:29:55 +0200 Subject: [PATCH 07/58] search for contacts with multiple parts of the name fixes #610 --- csharp/ICT/Petra/Server/lib/MPartner/web/SimplePartnerFind.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/csharp/ICT/Petra/Server/lib/MPartner/web/SimplePartnerFind.cs b/csharp/ICT/Petra/Server/lib/MPartner/web/SimplePartnerFind.cs index 9085d43205..db27ce9c79 100644 --- a/csharp/ICT/Petra/Server/lib/MPartner/web/SimplePartnerFind.cs +++ b/csharp/ICT/Petra/Server/lib/MPartner/web/SimplePartnerFind.cs @@ -76,7 +76,7 @@ public class TSimplePartnerFindWebConnector PartnerFindTDSSearchCriteriaRow CriteriaRow = CriteriaData.NewRowTyped(); CriteriaData.Rows.Add(CriteriaRow); - CriteriaRow.PartnerName = "%" + AFamilyNameOrOrganisation + "%"; + CriteriaRow.PartnerName = "%" + AFamilyNameOrOrganisation.Replace(" ", "% ") + "%"; if (APartnerKey.Length > 0) { @@ -235,6 +235,8 @@ public static PartnerFindTDS FindPartners(Int64 APartnerKey, Boolean AExactMatch int TotalRecords; TVerificationResultCollection VerificationResult; + ASearch = ASearch.Replace(" ", "% "); + AResult = FindPartners( String.Empty, //PartnerKey String.Empty, // Firstname From db32ed683508762daaa75b09d9721af02ec58a9f Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Tue, 8 Jun 2021 04:55:21 +0200 Subject: [PATCH 08/58] openpetra-server.sh: restore mysql: CREATE USER IF NOT EXISTS does not work yet on CentOS7 with mariadb 5.5 --- setup/petra0300/linuxserver/openpetra-server.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/setup/petra0300/linuxserver/openpetra-server.sh b/setup/petra0300/linuxserver/openpetra-server.sh index 49c32a8cea..a09b80fa32 100755 --- a/setup/petra0300/linuxserver/openpetra-server.sh +++ b/setup/petra0300/linuxserver/openpetra-server.sh @@ -238,7 +238,8 @@ mysqlrestore() { echo "CREATE DATABASE IF NOT EXISTS \`$OPENPETRA_DBNAME\`;" >> $OpenPetraPath/tmp/createtables-MySQL.sql echo "USE \`$OPENPETRA_DBNAME\`;" >> $OpenPetraPath/tmp/createtables-MySQL.sql cat $OpenPetraPath/db/createtables-MySQL.sql >> $OpenPetraPath/tmp/createtables-MySQL.sql - echo "CREATE USER IF NOT EXISTS '$OPENPETRA_DBUSER'@'localhost' IDENTIFIED BY '$OPENPETRA_DBPWD';" >> $OpenPetraPath/tmp/createtables-MySQL.sql + # CREATE USER IF NOT EXISTS does not work yet on CentOS7 with mariadb 5.5 + #echo "CREATE USER IF NOT EXISTS '$OPENPETRA_DBUSER'@'localhost' IDENTIFIED BY '$OPENPETRA_DBPWD';" >> $OpenPetraPath/tmp/createtables-MySQL.sql echo "GRANT ALL ON \`$OPENPETRA_DBNAME\`.* TO \`$OPENPETRA_DBUSER\`@\`localhost\`" >> $OpenPetraPath/tmp/createtables-MySQL.sql mysql -u root --host=$OPENPETRA_DBHOST --port=$OPENPETRA_DBPORT --password="$MYSQL_ROOT_PWD" < $OpenPetraPath/tmp/createtables-MySQL.sql rm $OpenPetraPath/tmp/createtables-MySQL.sql From 4dd3fb971baa46ea6984d8fe6099549adf702b31 Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Tue, 8 Jun 2021 05:11:37 +0200 Subject: [PATCH 09/58] import Chart of Accounts: fail with error message on deleting accounts that are referenced by motivation details --- .../Server/lib/MFinance/setup/GL.Setup.cs | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/csharp/ICT/Petra/Server/lib/MFinance/setup/GL.Setup.cs b/csharp/ICT/Petra/Server/lib/MFinance/setup/GL.Setup.cs index fad154b236..f1f6e90b9f 100644 --- a/csharp/ICT/Petra/Server/lib/MFinance/setup/GL.Setup.cs +++ b/csharp/ICT/Petra/Server/lib/MFinance/setup/GL.Setup.cs @@ -3327,6 +3327,7 @@ public static bool ImportAccountHierarchy(Int32 ALedgerNumber, string AHierarchy { // if there are any existing posted transactions that reference this account, it can't be deleted. ATransactionTable transTbl = null; + AMotivationDetailTable motivationDetailTbl = null; TDBTransaction transaction = new TDBTransaction(); TDataBase db = DBAccess.Connect("ImportAccountHierarchy"); @@ -3336,9 +3337,12 @@ public static bool ImportAccountHierarchy(Int32 ALedgerNumber, string AHierarchy { // if there are any existing posted transactions that reference this account, it can't be deleted. transTbl = ATransactionAccess.LoadViaAAccount(ALedgerNumber, accountRow.AccountCode, transaction); + + // if this account is referenced by a Motivation Detail, then it can't be deleted + motivationDetailTbl = AMotivationDetailAccess.LoadViaAAccountAccountCode(ALedgerNumber, accountRow.AccountCode, transaction); }); - if (transTbl.Rows.Count == 0) // No-one's used this account, so I can delete it. + if ((motivationDetailTbl.Rows.Count == 0) && (transTbl.Rows.Count == 0)) // No-one's used this account, so I can delete it. { // remove transaction types if they reference the account foreach (ATransactionTypeRow Row in MainDS.ATransactionType.Rows) @@ -3380,8 +3384,20 @@ public static bool ImportAccountHierarchy(Int32 ALedgerNumber, string AHierarchy } else { - string ErrorMsg = String.Format(Catalog.GetString("There is a balance on account {0}"), accountRow.AccountCode); - AVerificationResult.Add(new TVerificationResult(Catalog.GetString("Import hierarchy"), ErrorMsg, TResultSeverity.Resv_Critical)); + if (motivationDetailTbl.Rows.Count > 0) + { + foreach (AMotivationDetailRow row in motivationDetailTbl.Rows) + { + string ErrorMsg = String.Format(Catalog.GetString("The motivation detail {0}/{1} references account {2} which should be deleted"), row.MotivationGroupCode, row.MotivationDetailCode, accountRow.AccountCode); + AVerificationResult.Add(new TVerificationResult(Catalog.GetString("Import hierarchy"), ErrorMsg, TResultSeverity.Resv_Critical)); + } + } + + if (transTbl.Rows.Count > 0) + { + string ErrorMsg = String.Format(Catalog.GetString("There is a balance on account {0}"), accountRow.AccountCode); + AVerificationResult.Add(new TVerificationResult(Catalog.GetString("Import hierarchy"), ErrorMsg, TResultSeverity.Resv_Critical)); + } } db.CloseDBConnection(); From 941f27c044ddb2e6f9ca6f0d601a8894d486f355 Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Tue, 8 Jun 2021 05:42:44 +0200 Subject: [PATCH 10/58] show error if there are no motivation details when opening the donation batch. fixes #611 --- .../lib/MFinance/Gift/Gift.Transactions.cs | 78 ++++++++++++------- .../Finance/Gift/GiftEntry/GiftBatches.js | 30 +++++-- 2 files changed, 73 insertions(+), 35 deletions(-) diff --git a/csharp/ICT/Petra/Server/lib/MFinance/Gift/Gift.Transactions.cs b/csharp/ICT/Petra/Server/lib/MFinance/Gift/Gift.Transactions.cs index 503c093cec..9674d7361d 100644 --- a/csharp/ICT/Petra/Server/lib/MFinance/Gift/Gift.Transactions.cs +++ b/csharp/ICT/Petra/Server/lib/MFinance/Gift/Gift.Transactions.cs @@ -1719,66 +1719,74 @@ public static GiftBatchTDS LoadARecurringGiftBatchSingle(Int32 ALedgerNumber, In /// loads a list of gift transactions and details for the given ledger and batch ///
[RequireModulePermission("FINANCE-1")] - public static GiftBatchTDS LoadGiftTransactionsForBatch(Int32 ALedgerNumber, Int32 ABatchNumber, out Boolean ABatchIsUnposted, out String ACurrencyCode) + public static bool LoadGiftTransactionsForBatch(Int32 ALedgerNumber, Int32 ABatchNumber, out Boolean ABatchIsUnposted, out String ACurrencyCode, out GiftBatchTDS AMainDS, out TVerificationResultCollection AVerificationResult) { - #region Validate Arguments + AVerificationResult = new TVerificationResultCollection(); + ABatchIsUnposted = false; + ACurrencyCode = String.Empty; + AMainDS = null; - if (ALedgerNumber <= 0) - { - throw new EFinanceSystemInvalidLedgerNumberException(String.Format(Catalog.GetString( - "Function:{0} - The Ledger number must be greater than 0!"), - Utilities.GetMethodName(true)), ALedgerNumber); - } - else if (ABatchNumber <= 0) + try { - throw new EFinanceSystemInvalidBatchNumberException(String.Format(Catalog.GetString( - "Function:{0} - The Batch number must be greater than 0!"), - Utilities.GetMethodName(true)), ALedgerNumber, ABatchNumber); - } + #region Validate Arguments - #endregion Validate Arguments + if (ALedgerNumber <= 0) + { + throw new EFinanceSystemInvalidLedgerNumberException(String.Format(Catalog.GetString( + "Function:{0} - The Ledger number must be greater than 0!"), + Utilities.GetMethodName(true)), ALedgerNumber); + } + else if (ABatchNumber <= 0) + { + throw new EFinanceSystemInvalidBatchNumberException(String.Format(Catalog.GetString( + "Function:{0} - The Batch number must be greater than 0!"), + Utilities.GetMethodName(true)), ALedgerNumber, ABatchNumber); + } - GiftBatchTDS MainDS = new GiftBatchTDS(); - ABatchIsUnposted = false; + #endregion Validate Arguments - try - { - MainDS = LoadAGiftBatchAndRelatedData(ALedgerNumber, ABatchNumber, false); + AMainDS = LoadAGiftBatchAndRelatedData(ALedgerNumber, ABatchNumber, false); #region Validate Data - if ((MainDS == null) || (MainDS.Tables.Count == 0)) + if ((AMainDS == null) || (AMainDS.Tables.Count == 0)) { throw new EFinanceSystemDataObjectNullOrEmptyException(String.Format(Catalog.GetString( - "Function:{0} - Dataset MainDS is NULL or has no tables!"), + "Function:{0} - Dataset AMainDS is NULL or has no tables!"), Utilities.GetMethodName(true), ALedgerNumber)); } #endregion Validate Data - ABatchIsUnposted = (MainDS.AGiftBatch[0].BatchStatus == MFinanceConstants.BATCH_UNPOSTED); + ABatchIsUnposted = (AMainDS.AGiftBatch[0].BatchStatus == MFinanceConstants.BATCH_UNPOSTED); // drop all tables apart from AGift and AGiftDetail - foreach (DataTable table in MainDS.Tables) + foreach (DataTable table in AMainDS.Tables) { - if ((table.TableName != MainDS.AGift.TableName) && (table.TableName != MainDS.AGiftDetail.TableName)) + if ((table.TableName != AMainDS.AGift.TableName) && (table.TableName != AMainDS.AGiftDetail.TableName)) { table.Clear(); } } - MainDS.AcceptChanges(); + AMainDS.AcceptChanges(); } catch (Exception ex) { TLogging.LogException(ex, Utilities.GetMethodSignature()); - throw; + AVerificationResult.Add(new TVerificationResult( + Catalog.GetString("Load Gift Batch"), + "Cannot load gift batch because of error: " + ex.Message, + "Cannot load", + "ERROR_MODIFY_LOADING_GIFTBATCH", + TResultSeverity.Resv_Critical)); + return false; } ACurrencyCode = TFinanceServerLookupWebConnector.GetLedgerBaseCurrency(ALedgerNumber); - return MainDS; + return true; } /// @@ -2535,7 +2543,13 @@ public static bool PreviewGiftBatch(Int32 ALedgerNumber, Int32 ABatchNumber, out { bool BatchIsUnposted; string CurrencyCode; - GiftBatchTDS MainDS = LoadGiftTransactionsForBatch(ALedgerNumber, ABatchNumber, out BatchIsUnposted, out CurrencyCode); + GiftBatchTDS MainDS; + + if (!LoadGiftTransactionsForBatch(ALedgerNumber, ABatchNumber, out BatchIsUnposted, out CurrencyCode, out MainDS, out AVerificationResult)) + { + return false; + } + AVerificationResult = new TVerificationResultCollection(); if (action != "create") @@ -2774,7 +2788,13 @@ public static bool PreviewGiftBatch(Int32 ALedgerNumber, Int32 ABatchNumber, out { bool BatchIsUnposted; string CurrencyCode; - GiftBatchTDS MainDS = LoadGiftTransactionsForBatch(ALedgerNumber, ABatchNumber, out BatchIsUnposted, out CurrencyCode); + GiftBatchTDS MainDS; + + if (!LoadGiftTransactionsForBatch(ALedgerNumber, ABatchNumber, out BatchIsUnposted, out CurrencyCode, out MainDS, out AVerificationResult)) + { + return false; + } + AVerificationResult = new TVerificationResultCollection(); if (action != "create") diff --git a/js-client/src/forms/Finance/Gift/GiftEntry/GiftBatches.js b/js-client/src/forms/Finance/Gift/GiftEntry/GiftBatches.js index a1a4044479..38b82100d6 100644 --- a/js-client/src/forms/Finance/Gift/GiftEntry/GiftBatches.js +++ b/js-client/src/forms/Finance/Gift/GiftEntry/GiftBatches.js @@ -134,15 +134,21 @@ function open_gift_transactions(obj, number = -1, reload = false) { let x = {"ALedgerNumber":window.localStorage.getItem('current_ledger'), "ABatchNumber":number}; api.post('serverMFinance.asmx/TGiftTransactionWebConnector_LoadGiftTransactionsForBatch', x).then(function (data) { - data = JSON.parse(data.data.d); + parsed = JSON.parse(data.data.d); + + if (parsed.result == false) { + display_error(parsed.AVerificationResult); + return; + } + // on open, clear content let place_to_put_content = obj.find('.content_col').html(''); - for (item of data.result.AGift) { + for (item of parsed.AMainDS.AGift) { let transaction_row = $('[phantom] .tpl_gift').clone(); transaction_row = format_tpl(transaction_row, item); place_to_put_content.append(transaction_row); } - format_currency(data.ACurrencyCode); + format_currency(parsed.ACurrencyCode); format_date(); if (!reload) { $('.tpl_row .collapse').collapse('hide'); @@ -260,8 +266,14 @@ function edit_gift_trans(ledger_id, batch_id, trans_id) { // TODO: use serverMFinance.asmx/TGiftTransactionWebConnector_LoadGiftTransactionsDetail api.post('serverMFinance.asmx/TGiftTransactionWebConnector_LoadGiftTransactionsForBatch', x).then(function (data) { parsed = JSON.parse(data.data.d, parseDates); + + if (parsed.result == false) { + display_error(parsed.AVerificationResult); + return; + } + let searched = null; - for (trans of parsed.result.AGift) { + for (trans of parsed.AMainDS.AGift) { if (trans.a_gift_transaction_number_i == trans_id) { searched = trans; break; @@ -281,7 +293,7 @@ function edit_gift_trans(ledger_id, batch_id, trans_id) { tpl_edit_raw.find('.not_show_when_posted').hide(); } - for (detail of parsed.result.AGiftDetail) { + for (detail of parsed.AMainDS.AGiftDetail) { if (detail.a_gift_transaction_number_i == trans_id) { let tpl_trans_detail = format_tpl( $('[phantom] .tpl_trans_detail').clone(), detail ); @@ -302,8 +314,14 @@ function edit_gift_trans_detail(ledger_id, batch_id, trans_id, detail_id) { let x = {"ALedgerNumber":ledger_id, "ABatchNumber":batch_id}; api.post('serverMFinance.asmx/TGiftTransactionWebConnector_LoadGiftTransactionsForBatch', x).then(function (data) { parsed = JSON.parse(data.data.d); + + if (parsed.result == false) { + display_error(parsed.AVerificationResult); + return; + } + let searched = null; - for (trans of parsed.result.AGiftDetail) { + for (trans of parsed.AMainDS.AGiftDetail) { if (trans.a_gift_transaction_number_i == trans_id && trans.a_detail_number_i == detail_id) { searched = trans; break; From 2159db5e3d0c6b579111e869367c4f607607a736 Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Tue, 8 Jun 2021 05:59:24 +0200 Subject: [PATCH 11/58] show errors on broken yml file when importing chart of accounts --- csharp/ICT/Common/IO/Yml2Xml.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/csharp/ICT/Common/IO/Yml2Xml.cs b/csharp/ICT/Common/IO/Yml2Xml.cs index 61d104baf9..cc7b997fd3 100644 --- a/csharp/ICT/Common/IO/Yml2Xml.cs +++ b/csharp/ICT/Common/IO/Yml2Xml.cs @@ -4,7 +4,7 @@ // @Authors: // timop // -// Copyright 2004-2019 by OM International +// Copyright 2004-2021 by OM International // // This file is part of OpenPetra.org. // @@ -931,6 +931,13 @@ public XmlDocument ParseYML2XML() { // recursive parsing of the yml document ParseNode(root, 0); + + if (GetAbsoluteIndentationNext(currentLine) > 0) + { + string line = GetNextLine(); + TLogging.Log("Problem in line " + currentLine.ToString() + " " + line); + throw new Exception("Problem in line " + currentLine.ToString() + " " + line); + } } catch (Exception e) { From 875879a767fdb879f47758468c8e559bdff7a9d5 Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Tue, 8 Jun 2021 06:08:42 +0200 Subject: [PATCH 12/58] adjust call of LoadGiftTransactionsForBatch --- .../MFinance/server/Gift/RevertAdjustGiftBatch.test.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/csharp/ICT/Testing/lib/MFinance/server/Gift/RevertAdjustGiftBatch.test.cs b/csharp/ICT/Testing/lib/MFinance/server/Gift/RevertAdjustGiftBatch.test.cs index a78058fb8f..416b8e1d70 100644 --- a/csharp/ICT/Testing/lib/MFinance/server/Gift/RevertAdjustGiftBatch.test.cs +++ b/csharp/ICT/Testing/lib/MFinance/server/Gift/RevertAdjustGiftBatch.test.cs @@ -4,7 +4,7 @@ // @Authors: // timop // -// Copyright 2004-2020 by OM International +// Copyright 2004-2021 by OM International // // This file is part of OpenPetra.org. // @@ -162,8 +162,11 @@ public void TestAdjustGiftBatch() bool BatchIsUnposted; string CurrencyCode; - GiftBatchTDS BatchTDS = TGiftTransactionWebConnector.LoadGiftTransactionsForBatch( - FLedgerNumber, AdjustBatchNumber, out BatchIsUnposted, out CurrencyCode); + GiftBatchTDS BatchTDS; + TVerificationResultCollection VerificationResult; + + TGiftTransactionWebConnector.LoadGiftTransactionsForBatch( + FLedgerNumber, AdjustBatchNumber, out BatchIsUnposted, out CurrencyCode, out BatchTDS, out VerificationResult); // find the transaction to modify Int32 ToModify = (BatchTDS.AGiftDetail[1].GiftTransactionNumber == 2)?1:0; @@ -175,7 +178,6 @@ public void TestAdjustGiftBatch() // TODO change of donor // BatchTDS.Gift[1].DonorKey = - TVerificationResultCollection VerificationResult; if (TGiftTransactionWebConnector.SaveGiftBatchTDS(ref BatchTDS, out VerificationResult) != TSubmitChangesResult.scrOK) { Assert.Fail("Adjustment Gift Batch was not saved: " + VerificationResult.BuildVerificationResultString()); From 58b9e5435cda094d85927f4b5bd2dc2448d80a1f Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Wed, 16 Jun 2021 21:03:36 +0200 Subject: [PATCH 13/58] import and export GL transactions fixes #378 --- csharp/ICT/Common/IO/Csv2Xml.cs | 6 +-- .../Server/lib/MFinance/GL/GL.Importing.cs | 21 +++++++- .../Server/lib/MFinance/GL/GL.Transactions.cs | 54 ++++++++++++++++--- js-client/locales/de-DE/common.json | 3 ++ js-client/locales/en/common.json | 3 ++ .../GLBatchMaintenance/GLBatches.html | 25 +++++++-- .../GLBatchMaintenance/GLBatches.js | 31 ++++++++++- 7 files changed, 126 insertions(+), 17 deletions(-) diff --git a/csharp/ICT/Common/IO/Csv2Xml.cs b/csharp/ICT/Common/IO/Csv2Xml.cs index ade124cc46..cb7fdfaa0c 100644 --- a/csharp/ICT/Common/IO/Csv2Xml.cs +++ b/csharp/ICT/Common/IO/Csv2Xml.cs @@ -371,8 +371,8 @@ public static bool CSV2ExcelStream(string ACSVData, MemoryStream AStream, string IRow wsrow = null; ICell wscell = null; - Int32 rowCounter = 1; - Int16 colCounter = 1; + Int32 rowCounter = 0; + Int16 colCounter = 0; // we don't have headers for the columns @@ -411,7 +411,7 @@ public static bool CSV2ExcelStream(string ACSVData, MemoryStream AStream, string LineCounter++; rowCounter++; - colCounter = 1; + colCounter = 0; } workbook.Write(AStream); diff --git a/csharp/ICT/Petra/Server/lib/MFinance/GL/GL.Importing.cs b/csharp/ICT/Petra/Server/lib/MFinance/GL/GL.Importing.cs index 5c5d4f3626..ac25bc24ff 100644 --- a/csharp/ICT/Petra/Server/lib/MFinance/GL/GL.Importing.cs +++ b/csharp/ICT/Petra/Server/lib/MFinance/GL/GL.Importing.cs @@ -23,6 +23,7 @@ // using System; using System.Collections; +using System.Collections.Specialized; using System.Data; using System.Globalization; using System.IO; @@ -219,6 +220,7 @@ public class TGLImporting // Go round a loop reading the file line by line ImportMessage = Catalog.GetString("Parsing first line"); FImportLine = sr.ReadLine(); + FNewLine = String.Empty; Int32 TextProcessedLength = 0; @@ -961,6 +963,7 @@ public class TGLImporting // Go round a loop reading the file line by line FImportLine = sr.ReadLine(); + FNewLine = String.Empty; while (FImportLine != null) { @@ -972,7 +975,14 @@ public class TGLImporting // skip empty lines and commented lines if ((FImportLine.Trim().Length > 0) && !FImportLine.StartsWith("/*") && !FImportLine.StartsWith("#")) { - int numberOfElements = StringHelper.GetCSVList(FImportLine, FDelimiter).Count + 1; + StringCollection csvlist = StringHelper.GetCSVList(FImportLine, FDelimiter); + + if (csvlist == null) + { + throw new Exception("wrong delimiter"); + } + + int numberOfElements = csvlist.Count + 1; if (numberOfElements < 8) { @@ -1362,7 +1372,14 @@ public class TGLImporting NewTransaction.TransactionAmount = CreditAmount; } - NewTransaction.AmountInBaseCurrency = GLRoutines.Divide(NewTransaction.TransactionAmount, ANewJournalRow.ExchangeRateToBase); + if (ANewJournalRow.ExchangeRateToBase > 0) + { + NewTransaction.AmountInBaseCurrency = GLRoutines.Divide(NewTransaction.TransactionAmount, ANewJournalRow.ExchangeRateToBase); + } + else + { + NewTransaction.AmountInBaseCurrency = NewTransaction.TransactionAmount; + } // If we know the international currency exchange rate we can set the value for the transaction amount if (AIntlRateFromBase > 0.0m) diff --git a/csharp/ICT/Petra/Server/lib/MFinance/GL/GL.Transactions.cs b/csharp/ICT/Petra/Server/lib/MFinance/GL/GL.Transactions.cs index 01b7e785cd..30c32b8de6 100644 --- a/csharp/ICT/Petra/Server/lib/MFinance/GL/GL.Transactions.cs +++ b/csharp/ICT/Petra/Server/lib/MFinance/GL/GL.Transactions.cs @@ -26,11 +26,13 @@ using System.Collections.Generic; using System.Collections.Specialized; using System.Data; +using System.IO; using Ict.Common; using Ict.Common.DB; using Ict.Common.Exceptions; using Ict.Common.Verification; +using Ict.Common.IO; using Ict.Petra.Shared.MFinance; using Ict.Petra.Shared.MFinance.GL.Data; @@ -5377,6 +5379,46 @@ public static bool ExportAllGLBatchData(ArrayList batches, Hashtable requestPara return Exporting.ExportAllGLBatchData(batches, requestParams, out exportString); } + /// + /// export all transactions of a GL Batch to an Excel file + /// + [RequireModulePermission("FINANCE-1")] + public static bool ExportGLBatchTransactions(Int32 ALedgerNumber, Int32 ABatchNumber, Int32 AJournalNumber, out String AExportExcel) + { + TGLExporting Exporting = new TGLExporting(); + string CSVExport; + string Delimiter = ";"; + AExportExcel = String.Empty; + + ArrayList batches = new ArrayList(); + batches.Add(ABatchNumber); + Hashtable requestParams = new Hashtable(); + requestParams.Add("Delimiter", Delimiter); + requestParams.Add("ALedgerNumber", ALedgerNumber); + requestParams.Add("TransactionsOnly", true); + requestParams.Add("bDontSummarize", true); + requestParams.Add("Summary", false); + requestParams.Add("DateFormatString", "dd.MM.yyyy"); + // use journal currency + requestParams.Add("bUseBaseCurrency", false); + requestParams.Add("BaseCurrency", "99"); + requestParams.Add("DateForSummary", DateTime.Today); + requestParams.Add("NumberFormat", "European"); + + if (Exporting.ExportAllGLBatchData(batches, requestParams, out CSVExport)) + { + MemoryStream mstream = new MemoryStream(); + + if (TCsv2Xml.CSV2ExcelStream(CSVExport, mstream, Delimiter, "gltransactions")) + { + AExportExcel = Convert.ToBase64String(mstream.ToArray()); + return true; + } + } + + return false; + } + /// /// Import GL batch data /// The data file contents from the client is sent as a string, imported in the database @@ -5389,7 +5431,7 @@ public static bool ExportAllGLBatchData(ArrayList batches, Hashtable requestPara /// European or American /// /// Will be set to true on exit if the client needs to refresh its data - /// Additional messages to display in a messagebox + /// Additional messages to display in a messagebox /// false if error [RequireModulePermission("FINANCE-1")] public static bool ImportGLBatches( @@ -5400,12 +5442,12 @@ public static bool ExportAllGLBatchData(ArrayList batches, Hashtable requestPara string ANumberFormat, string ANewLine, out bool AClientRefreshRequired, - out TVerificationResultCollection AMessages + out TVerificationResultCollection AVerificationResult ) { TGLImporting Importing = new TGLImporting(); - return Importing.ImportGLBatches(ALedgerNumber, AImportString, ADelimiter, ADateFormatString, ANumberFormat, ANewLine, out AClientRefreshRequired, out AMessages); + return Importing.ImportGLBatches(ALedgerNumber, AImportString, ADelimiter, ADateFormatString, ANumberFormat, ANewLine, out AClientRefreshRequired, out AVerificationResult); } /// @@ -5422,7 +5464,7 @@ public static bool ExportAllGLBatchData(ArrayList batches, Hashtable requestPara /// European or American /// /// Will be set to true on exit if the client needs to refresh its data - /// + /// /// false if error [RequireModulePermission("FINANCE-1")] public static bool ImportGLTransactions( @@ -5435,7 +5477,7 @@ public static bool ExportAllGLBatchData(ArrayList batches, Hashtable requestPara string ANumberFormat, string ANewLine, out bool AClientRefreshRequired, - out TVerificationResultCollection AMessages + out TVerificationResultCollection AVerificationResult ) { TGLImporting Importing = new TGLImporting(); @@ -5447,7 +5489,7 @@ public static bool ExportAllGLBatchData(ArrayList batches, Hashtable requestPara AImportString, ADelimiter, ADateFormatString, ANumberFormat, ANewLine, out AClientRefreshRequired, - out AMessages); + out AVerificationResult); } /// diff --git a/js-client/locales/de-DE/common.json b/js-client/locales/de-DE/common.json index 981233f756..f1bb73aac0 100644 --- a/js-client/locales/de-DE/common.json +++ b/js-client/locales/de-DE/common.json @@ -379,6 +379,9 @@ "success_posted": "Der Stapel wurde erfolgreich gebucht", "success_revert": "Ein Stapel mit entgegengesetzten Transaktionen wurde erfolgreich angelegt und kann nun gebucht werden.", "import": "Transaktionen importieren", + "message_import_howto": "Die Daten bitte aus Microsoft Excel/LibreOffice Calc kopieren und direkt hier einfügen. Das Format sieht so aus:", + "column_meaning": "Bedeutung der Spalten", + "export": "Transaktionen exportieren", "isPosted": "Verbuchte Stapel können nicht mehr bearbeitet werden" }, "GiftBatches": { diff --git a/js-client/locales/en/common.json b/js-client/locales/en/common.json index 26b728be81..15744ee6c1 100644 --- a/js-client/locales/en/common.json +++ b/js-client/locales/en/common.json @@ -378,6 +378,9 @@ "success_revert": "A reversal batch has been created and can now be posted.", "success_posted": "The Batch has been posted", "import": "Import transactions", + "message_import_howto": "Please copy and paste the transactions directly from Microsoft Excel/LibreOffice Calc. This would look like this:", + "column_meaning": "Meaning of the columns", + "export": "Export transactions", "isPosted": "We cannot edit batches that have been posted already" }, "GiftBatches": { diff --git a/js-client/src/forms/Finance/GeneralLedger/GLBatchMaintenance/GLBatches.html b/js-client/src/forms/Finance/GeneralLedger/GLBatchMaintenance/GLBatches.html index 976e236d37..0b9a29aa53 100644 --- a/js-client/src/forms/Finance/GeneralLedger/GLBatchMaintenance/GLBatches.html +++ b/js-client/src/forms/Finance/GeneralLedger/GLBatchMaintenance/GLBatches.html @@ -29,6 +29,9 @@

{caption}

+ @@ -42,10 +45,24 @@

{caption}

{batch_post} 
diff --git a/js-client/src/forms/Finance/GeneralLedger/GLBatchMaintenance/GLBatches.js b/js-client/src/forms/Finance/GeneralLedger/GLBatchMaintenance/GLBatches.js index 6d8c2c2ae0..b6fe3a578c 100644 --- a/js-client/src/forms/Finance/GeneralLedger/GLBatchMaintenance/GLBatches.js +++ b/js-client/src/forms/Finance/GeneralLedger/GLBatchMaintenance/GLBatches.js @@ -400,8 +400,9 @@ function importTransactions(batch_id, csv_file) { ALedgerNumber: window.localStorage.getItem('current_ledger'), ABatchNumber: batch_id, AJournalNumber: 1, - NumberFormat: "European", - DateFormatString: "dmy" + ANumberFormat: "European", + ADateFormatString: "dmy", + ADelimiter: "\t", }; api.post('serverMFinance.asmx/TGLTransactionWebConnector_ImportGLTransactions', x).then(function (result) { @@ -410,6 +411,32 @@ function importTransactions(batch_id, csv_file) { display_message(i18next.t('forms.saved'), "success"); updateBatch(batch_id); } + if (parsed.result == false) { + display_error(parsed.AVerificationResult); + } + }) +} + +function exportTransactions(batch_id) { + + let x = { + ALedgerNumber: window.localStorage.getItem('current_ledger'), + ABatchNumber: batch_id, + AJournalNumber: 1 + }; + + api.post('serverMFinance.asmx/TGLTransactionWebConnector_ExportGLBatchTransactions', x).then(function (result) { + parsed = JSON.parse(result.data.d); + if (parsed.result == true) { + + var link = document.createElement("a"); + link.style = "display: none"; + link.href = 'data:application/excel;base64,'+parsed.AExportExcel; + link.download = i18next.t('GLTransactions') + '.xlsx'; + document.body.appendChild(link); + link.click(); + link.remove(); + } if (parsed.result == "false") { for (msg of parsed.AVerificationResult) { display_message(i18next.t(msg.code), "fail"); From 1b3bbdcae2eb2e91f3a5dbf5eb342743e94902da Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Fri, 18 Jun 2021 00:09:07 +0200 Subject: [PATCH 14/58] fix finance issues with debit and credit order, and with international currency. fixes #615 fixes #614 --- .../Common/Common.Tools.ExchangeRates.cs | 8 ++++++- .../Server/lib/MFinance/setup/GL.Setup.cs | 3 +++ .../GLBatchMaintenance/GLBatches.html | 22 +++++++++---------- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/csharp/ICT/Petra/Server/lib/MFinance/Common/Common.Tools.ExchangeRates.cs b/csharp/ICT/Petra/Server/lib/MFinance/Common/Common.Tools.ExchangeRates.cs index 71d7423377..f2a8a38b6f 100644 --- a/csharp/ICT/Petra/Server/lib/MFinance/Common/Common.Tools.ExchangeRates.cs +++ b/csharp/ICT/Petra/Server/lib/MFinance/Common/Common.Tools.ExchangeRates.cs @@ -4,7 +4,7 @@ // @Authors: // wolfgangu, christophert, timop // -// Copyright 2004-2019 by OM International +// Copyright 2004-2021 by OM International // // This file is part of OpenPetra.org. // @@ -561,6 +561,12 @@ public static decimal GetCorporateExchangeRate(string ACurrencyFrom, string ACur out decimal AExchangeRateToFind, TDataBase ADataBase = null) { + if (ACurrencyFrom == ACurrencyTo) + { + AExchangeRateToFind = 1.0M; + return true; + } + AExchangeRateToFind = decimal.MinValue; decimal ExchangeRateToFind = AExchangeRateToFind; diff --git a/csharp/ICT/Petra/Server/lib/MFinance/setup/GL.Setup.cs b/csharp/ICT/Petra/Server/lib/MFinance/setup/GL.Setup.cs index f1f6e90b9f..7c25241ed4 100644 --- a/csharp/ICT/Petra/Server/lib/MFinance/setup/GL.Setup.cs +++ b/csharp/ICT/Petra/Server/lib/MFinance/setup/GL.Setup.cs @@ -4316,6 +4316,9 @@ public static bool GetCurrencyCodes(out ACurrencyTable AResultTable) Int64 PartnerKey = Convert.ToInt64(ANewLedgerNumber) * 1000000L; GLSetupTDS MainDS = new GLSetupTDS(); + // we currently don't support an international currency + AIntlCurrency = ABaseCurrency; + ALedgerRow ledgerRow = MainDS.ALedger.NewRowTyped(); ledgerRow.LedgerNumber = ANewLedgerNumber; ledgerRow.LedgerName = ALedgerName; diff --git a/js-client/src/forms/Finance/GeneralLedger/GLBatchMaintenance/GLBatches.html b/js-client/src/forms/Finance/GeneralLedger/GLBatchMaintenance/GLBatches.html index 0b9a29aa53..e3fa9c02a7 100644 --- a/js-client/src/forms/Finance/GeneralLedger/GLBatchMaintenance/GLBatches.html +++ b/js-client/src/forms/Finance/GeneralLedger/GLBatchMaintenance/GLBatches.html @@ -52,7 +52,7 @@

{caption}

 4300	6200	test1	test	08.06.2021	0	100
 4300	9700	test2	test	08.06.2021	100	0
-

{column_meaning}: {trans_ccenter_code} {trans_account_code} {trans_narrative_code} {trans_ref} {trans_date} {CREDIT} {DEBIT}

+

{column_meaning}: {trans_ccenter_code} {trans_account_code} {trans_narrative_code} {trans_ref} {trans_date} {DEBIT} {CREDIT}

@@ -76,8 +76,8 @@

{caption}

{trans_number}
{trans_date}
-
{CREDIT}
{DEBIT}
+
{CREDIT}
{trans_account_code}
{trans_ccenter_code}
{trans_narrative_code}
@@ -96,8 +96,8 @@

{caption}

{val_a_transaction_number_i}
{val_a_transaction_date_d}
-
{val_creditamountbase}
{val_debitamountbase}
+
{val_creditamountbase}
{val_a_account_code_c}
{val_a_cost_centre_code_c}
{val_a_narrative_c}
@@ -173,19 +173,19 @@

{edittitle}

- {batchcredit} + {batchdebit}
- +
- {batchdebit} + {batchcredit}
- +
@@ -244,19 +244,19 @@

{edittitle}

- {trans_credit_in_base} + {trans_debit_in_base}
- +
- {trans_debit_in_base} + {trans_credit_in_base}
- +
From b82dafdc45839618983adc1bace133f422e9925d Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Sat, 19 Jun 2021 08:07:17 +0200 Subject: [PATCH 15/58] small fix for issues with parallel login --- csharp/ICT/Common/Session/Session.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/csharp/ICT/Common/Session/Session.cs b/csharp/ICT/Common/Session/Session.cs index 7665d48706..6fc0d36123 100644 --- a/csharp/ICT/Common/Session/Session.cs +++ b/csharp/ICT/Common/Session/Session.cs @@ -95,7 +95,10 @@ public static void InitThread(string AThreadDescription, string AConfigFileName, TDataBase db = null; // avoid dead lock on parallel logins - FDeleteSessionMutex.WaitOne(); + if (!FDeleteSessionMutex.WaitOne(5000)) + { + throw new Exception("Server is too busy"); + } try { From d379fd2029f56db9743a87ec23251f61b8f4e66d Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Tue, 22 Jun 2021 06:09:02 +0200 Subject: [PATCH 16/58] another fix for abandoned mutex --- csharp/ICT/Common/Session/Session.cs | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/csharp/ICT/Common/Session/Session.cs b/csharp/ICT/Common/Session/Session.cs index 6fc0d36123..6bc8a5e43c 100644 --- a/csharp/ICT/Common/Session/Session.cs +++ b/csharp/ICT/Common/Session/Session.cs @@ -94,10 +94,22 @@ public static void InitThread(string AThreadDescription, string AConfigFileName, TDataBase db = null; - // avoid dead lock on parallel logins - if (!FDeleteSessionMutex.WaitOne(5000)) + try + { + // avoid dead lock on parallel logins + if (!FDeleteSessionMutex.WaitOne(5000)) + { + throw new Exception("Server is too busy"); + } + } + catch(AbandonedMutexException ex) { - throw new Exception("Server is too busy"); + TLogging.Log("Mutex was abandoned"); + + // Whether or not the exception was thrown, the current + // thread owns the mutex, and must release it. + if (ex.Mutex != null) ex.Mutex.ReleaseMutex(); + throw new Exception("AbandonedMutex has been cleared"); } try @@ -135,7 +147,10 @@ public static void InitThread(string AThreadDescription, string AConfigFileName, } finally { - db.CloseDBConnection(); + if (db != null) + { + db.CloseDBConnection(); + } FDeleteSessionMutex.ReleaseMutex(); } From 79df9a25a154d51cdf46d158e48823f3af8af27e Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Fri, 9 Jul 2021 07:28:04 +0200 Subject: [PATCH 17/58] Set transaction Currency per GL Batch related to foreign currencies. related to #613 --- .../Server/lib/MFinance/GL/GL.Transactions.cs | 126 ++++++++++++------ .../data/Finance.GL.TypedDataSets.xml | 6 +- js-client/locales/de-DE/common.json | 1 + js-client/locales/en/common.json | 1 + .../GLBatchMaintenance/GLBatches.html | 9 ++ .../GLBatchMaintenance/GLBatches.js | 4 +- 6 files changed, 103 insertions(+), 44 deletions(-) diff --git a/csharp/ICT/Petra/Server/lib/MFinance/GL/GL.Transactions.cs b/csharp/ICT/Petra/Server/lib/MFinance/GL/GL.Transactions.cs index 30c32b8de6..92202bfc35 100644 --- a/csharp/ICT/Petra/Server/lib/MFinance/GL/GL.Transactions.cs +++ b/csharp/ICT/Petra/Server/lib/MFinance/GL/GL.Transactions.cs @@ -45,6 +45,7 @@ using Ict.Petra.Server.MFinance.Common; using Ict.Petra.Server.MFinance.Common.ServerLookups.WebConnectors; using Ict.Petra.Server.MFinance.GL.Data.Access; +using Ict.Petra.Server.MCommon.Data.Access; namespace Ict.Petra.Server.MFinance.GL.WebConnectors { @@ -185,6 +186,17 @@ public static GLBatchTDS LoadABatch(Int32 ALedgerNumber, int ABatchYear, int ABa ALedgerNumber); db.Select(MainDS, SelectClause + FilterByPeriod + FilterByBatchStatus, MainDS.ABatch.TableName, Transaction); + + // Get the transaction currency of the first journal + foreach (GLBatchTDSABatchRow batch in MainDS.ABatch.Rows) + { + AJournalAccess.LoadViaABatch(MainDS, batch.LedgerNumber, batch.BatchNumber, Transaction); + if (MainDS.AJournal.Count > 0) + { + batch.TransactionCurrency = MainDS.AJournal[0].TransactionCurrency; + MainDS.AJournal.Clear(); + } + } }); MainDS.AcceptChanges(); @@ -282,21 +294,6 @@ public static GLBatchTDS LoadABatch(Int32 ALedgerNumber, Int32 ABatchNumber, out /// [RequireModulePermission("FINANCE-1")] public static GLBatchTDS LoadABatchAndRelatedTables(Int32 ALedgerNumber, Int32 ABatchNumber) - { - TDataBase db = DBAccess.Connect("LoadABatchAndRelatedTables"); - - return LoadABatchAndRelatedTables(db, ALedgerNumber, ABatchNumber); - } - - /// - /// load the specified batch and its journals and transactions and attributes. - /// this method is called after a batch has been posted. - /// - /// - /// - /// - [RequireModulePermission("FINANCE-1")] - public static GLBatchTDS LoadABatchAndRelatedTablesUsingPrivateDb(Int32 ALedgerNumber, Int32 ABatchNumber) { TDataBase dbConnection = DBAccess.Connect("LoadABatchAndRelatedTables"); @@ -3182,6 +3179,7 @@ public static GLBatchTDS LoadARecurringTransAnalAttribForJournal(Int32 ALedgerNu string ABatchDescription, DateTime ADateEffective, string ABatchStatus, + string TransactionCurrency, Decimal ABatchCreditTotal, Decimal ABatchDebitTotal, out TVerificationResultCollection AVerificationResult, @@ -3191,42 +3189,92 @@ public static GLBatchTDS LoadARecurringTransAnalAttribForJournal(Int32 ALedgerNu AVerificationResult = new TVerificationResultCollection(); - if ((action == "create") || (action == "edit")) - { - string CurrencyCode; - MainDS = LoadABatch(ALedgerNumber, ABatchNumber, out CurrencyCode); + TDataBase db = DBAccess.Connect("MaintainBatches", ADataBase); - if (MainDS.ABatch.Rows.Count != 1) + try + { + if ((action == "create") || (action == "edit")) { - return false; - } + MainDS = LoadABatchAndRelatedTables(db, ALedgerNumber, ABatchNumber); - ABatchRow row = MainDS.ABatch[0]; + if (MainDS.ABatch.Rows.Count != 1) + { + return false; + } - row.BatchDescription = ABatchDescription; - row.DateEffective = ADateEffective; - row.BatchStatus = ABatchStatus; - row.BatchCreditTotal = ABatchCreditTotal; - row.BatchDebitTotal = ABatchDebitTotal; + ABatchRow row = MainDS.ABatch[0]; - try + row.BatchDescription = ABatchDescription; + row.DateEffective = ADateEffective; + row.BatchStatus = ABatchStatus; + row.BatchCreditTotal = ABatchCreditTotal; + row.BatchDebitTotal = ABatchDebitTotal; + + AJournalRow jrow = MainDS.AJournal[0]; + + if (jrow.TransactionCurrency != TransactionCurrency) + { + TransactionCurrency = TransactionCurrency.ToUpper(); + + TDBTransaction Transaction = new TDBTransaction(); + + bool CurrencyExists = false; + db.ReadTransaction( + ref Transaction, + delegate + { + CurrencyExists = ACurrencyAccess.Exists(TransactionCurrency, Transaction); + }); + + if (!CurrencyExists) + { + AVerificationResult.Add(new TVerificationResult( + Catalog.GetString("Cannot update currency"), + Catalog.GetString("Invalid currency code"), + TResultSeverity.Resv_Critical)); + return false; + } + + if (MainDS.ATransaction.Count == 0) + { + jrow.TransactionCurrency = TransactionCurrency; + } + else + { + AVerificationResult.Add(new TVerificationResult( + Catalog.GetString("Cannot update currency"), + Catalog.GetString("There are already transactions in the batch"), + TResultSeverity.Resv_Critical)); + return false; + } + } + + try + { + SaveGLBatchTDS(ref MainDS, out AVerificationResult, ADataBase); + } + catch (Exception) + { + return false; + } + } + else { - SaveGLBatchTDS(ref MainDS, out AVerificationResult, ADataBase); + return false; } - catch (Exception) + + if (!TVerificationHelper.IsNullOrOnlyNonCritical(AVerificationResult)) { + TLogging.Log(AVerificationResult.BuildVerificationResultString()); return false; } } - else - { - return false; - } - - if (!TVerificationHelper.IsNullOrOnlyNonCritical(AVerificationResult)) + finally { - TLogging.Log(AVerificationResult.BuildVerificationResultString()); - return false; + if (ADataBase == null) + { + db.CloseDBConnection(); + } } return true; diff --git a/csharp/ICT/Petra/Shared/lib/MFinance/data/Finance.GL.TypedDataSets.xml b/csharp/ICT/Petra/Shared/lib/MFinance/data/Finance.GL.TypedDataSets.xml index 6b9e1fb874..d5b8316b01 100644 --- a/csharp/ICT/Petra/Shared/lib/MFinance/data/Finance.GL.TypedDataSets.xml +++ b/csharp/ICT/Petra/Shared/lib/MFinance/data/Finance.GL.TypedDataSets.xml @@ -7,7 +7,9 @@ -
+
+ +
@@ -166,4 +168,4 @@
- \ No newline at end of file + diff --git a/js-client/locales/de-DE/common.json b/js-client/locales/de-DE/common.json index f1bb73aac0..89d257ab6a 100644 --- a/js-client/locales/de-DE/common.json +++ b/js-client/locales/de-DE/common.json @@ -345,6 +345,7 @@ "batchnumber": "Stapel Nummer", "batchname": "Stapel Name", "batch_status": "Stapel Status", + "transaction_currency": "Stapel Währung", "period": "Monat", "year": "Jahr", "batchcredit": "Stapel Kredit", diff --git a/js-client/locales/en/common.json b/js-client/locales/en/common.json index 15744ee6c1..c4d69aa2a2 100644 --- a/js-client/locales/en/common.json +++ b/js-client/locales/en/common.json @@ -344,6 +344,7 @@ "batchnumber": "Batch Number", "batchname": "Batch Description", "batch_status": "Status", + "transaction_currency": "Currency", "period": "Period", "year": "Year", "batchcredit": "Total Credit", diff --git a/js-client/src/forms/Finance/GeneralLedger/GLBatchMaintenance/GLBatches.html b/js-client/src/forms/Finance/GeneralLedger/GLBatchMaintenance/GLBatches.html index e3fa9c02a7..ec2c5ab33a 100644 --- a/js-client/src/forms/Finance/GeneralLedger/GLBatchMaintenance/GLBatches.html +++ b/js-client/src/forms/Finance/GeneralLedger/GLBatchMaintenance/GLBatches.html @@ -171,6 +171,15 @@

{edittitle}

+
+
+ {transaction_currency} +
+
+ +
+
+
{batchdebit} diff --git a/js-client/src/forms/Finance/GeneralLedger/GLBatchMaintenance/GLBatches.js b/js-client/src/forms/Finance/GeneralLedger/GLBatchMaintenance/GLBatches.js index b6fe3a578c..83abd3470b 100644 --- a/js-client/src/forms/Finance/GeneralLedger/GLBatchMaintenance/GLBatches.js +++ b/js-client/src/forms/Finance/GeneralLedger/GLBatchMaintenance/GLBatches.js @@ -319,9 +319,7 @@ function save_edit_batch(obj_modal) { updateBatch(payload['ABatchNumber']); } if (parsed.result == false) { - for (msg of parsed.AVerificationResult) { - display_message(i18next.t('GLBatches.' + msg.code), "fail"); - } + display_error(parsed.AVerificationResult); } }); } From c53271604ed104d043e3fa452a8767d1d780b269 Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Thu, 19 Aug 2021 08:06:52 +0200 Subject: [PATCH 18/58] adjustments for running OpenPetra in Hostsharing shared hosting --- .../petra0300/linuxserver/openpetra-server.sh | 115 ++++++++++-------- 1 file changed, 63 insertions(+), 52 deletions(-) diff --git a/setup/petra0300/linuxserver/openpetra-server.sh b/setup/petra0300/linuxserver/openpetra-server.sh index a09b80fa32..802a3fec49 100755 --- a/setup/petra0300/linuxserver/openpetra-server.sh +++ b/setup/petra0300/linuxserver/openpetra-server.sh @@ -36,7 +36,11 @@ generatepwd() { } getConfigOfCurrentCustomer() { - config=/home/$OP_CUSTOMER/etc/PetraServerConsole.config + config=$userHome/etc/PetraServerConsole.config + if [ ! -f $config ] + then + config=$HOME/etc/PetraServerConsole.config + fi if [ -f $config ] then export userName=$OP_CUSTOMER @@ -94,9 +98,13 @@ elif [ "$1" != "init" ]; then getConfigOfCurrentCustomer fi +if [ -z $userHome ]; then + export userHome=/home/$userName +fi + if [ -z "$backupfile" ] then - export backupfile=/home/$userName/backup/backup-`date +%Y%m%d%H`.sql.gz + export backupfile=$userHome/backup/backup-`date +%Y%m%d%H`.sql.gz fi if [ "$2" != "" ] @@ -132,7 +140,7 @@ stop() { echo "Stopping OpenPetra server" if [ "`whoami`" = "$userName" ] then - cd $documentroot/bin; mono --runtime=v4.0 --server PetraServerAdminConsole.exe -C:/home/$userName/etc/PetraServerAdminConsole.config -Command:Stop + cd $documentroot/bin; mono --runtime=v4.0 --server PetraServerAdminConsole.exe -C:$userHome/etc/PetraServerAdminConsole.config -Command:Stop else echo "Error: can only stop the server as user $userName" exit -1 @@ -142,7 +150,10 @@ stop() { runAsUser() { cmd=$1 - if [ "`whoami`" = "$userName" ] + if [ -f $userHome/etc/PetraServerConsole.config ] + then + bash -c "$cmd" || exit -1 + elif [ "`whoami`" = "$userName" ] then bash -c "$cmd" || exit -1 else @@ -152,28 +163,28 @@ runAsUser() { # load a new database from a yml.gz file. this will overwrite the current database! loadYmlGz() { - echo "loading database from $ymlgzfile with config /home/$userName/etc/PetraServerConsole.config" - runAsUser "cd $OpenPetraPathBin; mono --runtime=v4.0 Ict.Petra.Tools.MSysMan.YmlGzImportExport.exe -C:/home/$userName/etc/PetraServerConsole.config -Action:load -YmlGzFile:$ymlgzfile" + echo "loading database from $ymlgzfile with config $userHome/etc/PetraServerConsole.config" + runAsUser "cd $OpenPetraPathBin; mono --runtime=v4.0 Ict.Petra.Tools.MSysMan.YmlGzImportExport.exe -C:$userHome/etc/PetraServerConsole.config -Action:load -YmlGzFile:$ymlgzfile" } # dump the database to a yml.gz file dumpYmlGz() { - runAsUser "cd $OpenPetraPathBin; mono --runtime=v4.0 Ict.Petra.Tools.MSysMan.YmlGzImportExport.exe -C:/home/$userName/etc/PetraServerConsole.config -Action:dump -YmlGzFile:$ymlgzfile" || exit -1 + runAsUser "cd $OpenPetraPathBin; mono --runtime=v4.0 Ict.Petra.Tools.MSysMan.YmlGzImportExport.exe -C:$userHome/etc/PetraServerConsole.config -Action:dump -YmlGzFile:$ymlgzfile" || exit -1 } # display the status to check for logged in users etc status() { - runAsUser "cd $OpenPetraPathBin; mono --runtime=v4.0 --server PetraServerAdminConsole.exe -C:/home/$userName/etc/PetraServerAdminConsole.config -Command:ConnectedClients" + runAsUser "cd $OpenPetraPathBin; mono --runtime=v4.0 --server PetraServerAdminConsole.exe -C:$userHome/etc/PetraServerAdminConsole.config -Command:ConnectedClients" } # display a menu to check for logged in users etc menu() { - runAsUser "cd $OpenPetraPathBin; mono --runtime=v4.0 --server PetraServerAdminConsole.exe -C:/home/$userName/etc/PetraServerAdminConsole.config" + runAsUser "cd $OpenPetraPathBin; mono --runtime=v4.0 --server PetraServerAdminConsole.exe -C:$userHome/etc/PetraServerAdminConsole.config" } # send reminders per E-Mail sendReminders() { - runAsUser "cd $OpenPetraPathBin; mono --runtime=v4.0 --server PetraServerAdminConsole.exe -C:/home/$userName/etc/PetraServerAdminConsole.config -Command:SendReminders" + runAsUser "cd $OpenPetraPathBin; mono --runtime=v4.0 --server PetraServerAdminConsole.exe -C:$userHome/etc/PetraServerAdminConsole.config -Command:SendReminders" } sendRemindersAll() { @@ -205,12 +216,12 @@ mysqlscript() { # backup the mysql database mysqlbackup() { echo `date` "Writing to " $backupfile - cat > /home/$userName/.my.cnf < $userHome/.my.cnf < $backupfile" echo `date` "Finished!" } @@ -248,9 +259,9 @@ mysqlrestore() { echo $backupfile|grep -qE '\.gz$' if [ $? -eq 0 ] then - cat $backupfile | gunzip | mysql -u $OPENPETRA_DBUSER --password="$OPENPETRA_DBPWD" --host=$OPENPETRA_DBHOST --port=$OPENPETRA_DBPORT $OPENPETRA_DBNAME > /home/$userName/log/mysqlload.log + cat $backupfile | gunzip | mysql -u $OPENPETRA_DBUSER --password="$OPENPETRA_DBPWD" --host=$OPENPETRA_DBHOST --port=$OPENPETRA_DBPORT $OPENPETRA_DBNAME > $userHome/log/mysqlload.log else - mysql -u $OPENPETRA_DBUSER --password="$OPENPETRA_DBPWD" --host=$OPENPETRA_DBHOST --port=$OPENPETRA_DBPORT $OPENPETRA_DBNAME < $backupfile > /home/$userName/log/mysqlload.log + mysql -u $OPENPETRA_DBUSER --password="$OPENPETRA_DBPWD" --host=$OPENPETRA_DBHOST --port=$OPENPETRA_DBPORT $OPENPETRA_DBNAME < $backupfile > $userHome/log/mysqlload.log fi echo `date` "Finished!" @@ -299,9 +310,9 @@ postgresqlrestore() { echo $backupfile|grep -qE '\.gz$' if [ $? -eq 0 ] then - su - $userName -c "cat $backupfile | gunzip | psql -h $OPENPETRA_DBHOST -p $OPENPETRA_DBPORT -U $OPENPETRA_DBUSER $OPENPETRA_DBNAME -q > /home/$userName/log/pgload.log" + su - $userName -c "cat $backupfile | gunzip | psql -h $OPENPETRA_DBHOST -p $OPENPETRA_DBPORT -U $OPENPETRA_DBUSER $OPENPETRA_DBNAME -q > $userHome/log/pgload.log" else - su - $userName -c "psql -h $OPENPETRA_DBHOST -p $OPENPETRA_DBPORT -U $OPENPETRA_DBUSER $OPENPETRA_DBNAME -q -f $backupfile > /home/$userName/log/pgload.log" + su - $userName -c "psql -h $OPENPETRA_DBHOST -p $OPENPETRA_DBPORT -U $OPENPETRA_DBUSER $OPENPETRA_DBNAME -q -f $backupfile > $userHome/log/pgload.log" fi #if pgdump was called with data-only, we would need to create the contraints and indexes here @@ -323,10 +334,10 @@ backupall() { for d in /home/$OPENPETRA_USER_PREFIX*; do if [ -d $d ]; then export OP_CUSTOMER=`basename $d` - export backupfile=/home/$OP_CUSTOMER/backup/backup-`date +%Y%m%d%H`.sql.gz + export backupfile=$userHome/backup/backup-`date +%Y%m%d%H`.sql.gz # if there is no backup for today yet, just create one - if [ ! -f /home/$OP_CUSTOMER/backup/backup-`date +%Y%m%d`00.sql.gz ]; then + if [ ! -f $userHome/backup/backup-`date +%Y%m%d`00.sql.gz ]; then $THIS_SCRIPT backup else # do we have a successful login from outside within the past 7 days? @@ -348,18 +359,18 @@ backupall() { fi # only keep the hourly backups of today and yesterday. before that, keep only one backup per day - if [ -f /home/$OP_CUSTOMER/backup/backup-`date --date='2 days ago' +%Y%m%d`00.sql.gz ]; then + if [ -f $userHome/backup/backup-`date --date='2 days ago' +%Y%m%d`00.sql.gz ]; then for i in {1..23}; do hour=$(printf "%02d" $i) - rm -f /home/$OP_CUSTOMER/backup/backup-`date --date='2 days ago' +%Y%m%d`$hour.sql.gz - rm -f /home/$OP_CUSTOMER/backup/backup-`date --date='3 days ago' +%Y%m%d`$hour.sql.gz - rm -f /home/$OP_CUSTOMER/backup/backup-`date --date='4 days ago' +%Y%m%d`$hour.sql.gz + rm -f $userHome/backup/backup-`date --date='2 days ago' +%Y%m%d`$hour.sql.gz + rm -f $userHome/backup/backup-`date --date='3 days ago' +%Y%m%d`$hour.sql.gz + rm -f $userHome/backup/backup-`date --date='4 days ago' +%Y%m%d`$hour.sql.gz done fi # delete backups older than 5 days - rm -f /home/$OP_CUSTOMER/backup/backup-`date --date='5 days ago' +%Y%m%d`*.sql.gz - rm -f /home/$OP_CUSTOMER/backup/backup-`date --date='6 days ago' +%Y%m%d`*.sql.gz - rm -f /home/$OP_CUSTOMER/backup/backup-`date --date='7 days ago' +%Y%m%d`*.sql.gz + rm -f $userHome/backup/backup-`date --date='5 days ago' +%Y%m%d`*.sql.gz + rm -f $userHome/backup/backup-`date --date='6 days ago' +%Y%m%d`*.sql.gz + rm -f $userHome/backup/backup-`date --date='7 days ago' +%Y%m%d`*.sql.gz fi done } @@ -427,7 +438,7 @@ rewrite_conf() { exit -1 fi - mv -f /home/$OP_CUSTOMER/etc/PetraServerConsole.config /home/$OP_CUSTOMER/etc/PetraServerConsole.config.bak + mv -f $userHome/etc/PetraServerConsole.config $userHome/etc/PetraServerConsole.config.bak init fi } @@ -458,7 +469,7 @@ init() { userName=$OP_CUSTOMER - if [ -f /home/$userName/etc/PetraServerConsole.config ] + if [ -f $userHome/etc/PetraServerConsole.config ] then echo "it seems there is already an instance configured" exit -1 @@ -472,14 +483,14 @@ init() { echo "preparing OpenPetra instance..." - id $userName > /dev/null 2>&1 || useradd --home /home/$userName -G openpetra $userName - mkdir -p /home/$userName/log - mkdir -p /home/$userName/tmp - mkdir -p /home/$userName/etc - mkdir -p /home/$userName/backup + id $userName > /dev/null 2>&1 || useradd --home $userHome -G openpetra $userName + mkdir -p $userHome/log + mkdir -p $userHome/tmp + mkdir -p $userHome/etc + mkdir -p $userHome/backup # copy config files (server, serveradmin.config) to etc, with adjustments - cfgfile=/home/$userName/etc/PetraServerConsole.config + cfgfile=$userHome/etc/PetraServerConsole.config cat $OpenPetraPath/templates/PetraServerConsole.config \ | sed -e "s/OPENPETRA_PORT/$OPENPETRA_HTTP_PORT/" \ | sed -e "s/OPENPETRA_RDBMSType/$OPENPETRA_RDBMSType/" \ @@ -522,7 +533,7 @@ init() { cat $OpenPetraPath/templates/PetraServerAdminConsole.config \ | sed -e "s/USERNAME/$userName/" \ | sed -e "s#/openpetraOPENPETRA_PORT/#:$OPENPETRA_HTTP_PORT/#" \ - > /home/$userName/etc/PetraServerAdminConsole.config + > $userHome/etc/PetraServerAdminConsole.config nginx_conf_path=/etc/nginx/conf.d/$OP_CUSTOMER.conf if [[ "$install_type" == "devenv" ]]; then @@ -544,15 +555,15 @@ init() { sed -i "s#OPENPETRA_URL#$OPENPETRA_HTTP_URL#g" $nginx_conf_path systemctl reload nginx - touch /home/$userName/log/Server.log - chown -R $userName:openpetra /home/$userName - chmod g+r -R /home/$userName - chmod g+rx /home/$userName - chmod g+rwx /home/$userName/log - chmod g+rwx /home/$userName/tmp - chmod g+rwx /home/$userName/backup - chmod g+s /home/$userName/log - chmod g+rw /home/$userName/log/Server.log + touch $userHome/log/Server.log + chown -R $userName:openpetra $userHome + chmod g+r -R $userHome + chmod g+rx $userHome + chmod g+rwx $userHome/log + chmod g+rwx $userHome/tmp + chmod g+rwx $userHome/backup + chmod g+s $userHome/log + chmod g+rw $userHome/log/Server.log } # this will overwrite all existing data @@ -613,19 +624,19 @@ postgresqlinitdb() { fi addPwd=1 - if [ -f /home/$userName/.pgpass ] + if [ -f $userHome/.pgpass ] then - if [ "`cat /home/$userName/.pgpass | grep '^*:'$OPENPETRA_DBPORT':'$OPENPETRA_DBNAME':'$OPENPETRA_DBUSER':'`" ]; then + if [ "`cat $userHome/.pgpass | grep '^*:'$OPENPETRA_DBPORT':'$OPENPETRA_DBNAME':'$OPENPETRA_DBUSER':'`" ]; then addPwd=0 fi fi if [ $addPwd -eq 1 ] then - echo "*:$OPENPETRA_DBPORT:$OPENPETRA_DBNAME:$OPENPETRA_DBUSER:$OPENPETRA_DBPWD" >> /home/$userName/.pgpass + echo "*:$OPENPETRA_DBPORT:$OPENPETRA_DBNAME:$OPENPETRA_DBUSER:$OPENPETRA_DBPWD" >> $userHome/.pgpass fi - chown -R $userName:$userName /home/$userName - chmod 600 /home/$userName/.pgpass - chown $userName /home/$userName/.pgpass + chown -R $userName:$userName $userHome + chmod 600 $userHome/.pgpass + chown $userName $userHome/.pgpass echo "creating tables..." su - $userName -c "psql -h $OPENPETRA_DBHOST -p $OPENPETRA_DBPORT -U $OPENPETRA_DBUSER $OPENPETRA_DBNAME -q -f $OpenPetraPath/db30/createtables-PostgreSQL.sql" @@ -675,20 +686,20 @@ initdb() { if [ "$LOCK_SYSADMIN" == 1 ] then # for hosted environment, the sysadmin user will only be unlocked for a new customer - su $userName -c "cd $OpenPetraPathBin; mono --runtime=v4.0 --server PetraServerAdminConsole.exe -C:/home/$userName/etc/PetraServerAdminConsole.config -Command:LockSysadmin" + su $userName -c "cd $OpenPetraPathBin; mono --runtime=v4.0 --server PetraServerAdminConsole.exe -C:$userHome/etc/PetraServerAdminConsole.config -Command:LockSysadmin" elif [ -z $SYSADMIN_PWD ] then SYSADMIN_PWD="CHANGEME" echo "For production use, please change the password for user SYSADMIN immediately (initial password: $SYSADMIN_PWD)" else - su $userName -c "cd $OpenPetraPathBin; mono --runtime=v4.0 --server PetraServerAdminConsole.exe -C:/home/$userName/etc/PetraServerAdminConsole.config -Command:SetPassword -UserID:SYSADMIN -NewPassword:'$SYSADMIN_PWD' || echo 'ERROR: password was not set. It is probably too weak... Login with password CHANGEME instead, and change it immediately!'" + su $userName -c "cd $OpenPetraPathBin; mono --runtime=v4.0 --server PetraServerAdminConsole.exe -C:$userHome/etc/PetraServerAdminConsole.config -Command:SetPassword -UserID:SYSADMIN -NewPassword:'$SYSADMIN_PWD' || echo 'ERROR: password was not set. It is probably too weak... Login with password CHANGEME instead, and change it immediately!'" fi fi } # this will update the current database upgradedb() { - runAsUser "cd $OpenPetraPathBin; mono --runtime=v4.0 --server PetraServerAdminConsole.exe -C:/home/$OP_CUSTOMER/etc/PetraServerAdminConsole.config -Command:UpgradeDatabase" + runAsUser "cd $OpenPetraPathBin; mono --runtime=v4.0 --server PetraServerAdminConsole.exe -C:$userHome/etc/PetraServerAdminConsole.config -Command:UpgradeDatabase" } case "$1" in From 394d0ac3c47c9ae9c6cfaa133e7e5a692a5491f8 Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Sat, 21 Aug 2021 06:39:18 +0200 Subject: [PATCH 19/58] fix previous commit about etc path for openpetra customer --- setup/petra0300/linuxserver/openpetra-server.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/setup/petra0300/linuxserver/openpetra-server.sh b/setup/petra0300/linuxserver/openpetra-server.sh index 802a3fec49..6d4cfb5541 100755 --- a/setup/petra0300/linuxserver/openpetra-server.sh +++ b/setup/petra0300/linuxserver/openpetra-server.sh @@ -41,6 +41,10 @@ getConfigOfCurrentCustomer() { then config=$HOME/etc/PetraServerConsole.config fi + if [ ! -f $config ] + then + config=/home/$OP_CUSTOMER/etc/PetraServerConsole.config + fi if [ -f $config ] then export userName=$OP_CUSTOMER @@ -99,7 +103,7 @@ elif [ "$1" != "init" ]; then fi if [ -z $userHome ]; then - export userHome=/home/$userName + export userHome=/home/$OP_CUSTOMER fi if [ -z "$backupfile" ] From 3eea35e54d60ade7cb01888e08cca2730b882e8f Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Sat, 21 Aug 2021 06:45:44 +0200 Subject: [PATCH 20/58] fix appveyor script with paramter iknowwhatiamdoing for getopenpetraorg.sh --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index f1ab0a7c1a..22afecaf1f 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -14,7 +14,7 @@ install: #- sudo -E ln -s `which npm` /usr/bin/npm #- sudo -E chown -R 1001:1001 "/home/appveyor/.npm" #- sudo sed -i "s/\[mysqld\]/[mysqld]\nskip-name-resolve/g" /etc/mysql/my.cnf && sudo systemctl restart mysql -- curl https://get.openpetra.org > getopenpetra.sh && chmod a+x getopenpetra.sh && sudo -E ./getopenpetra.sh devenv +- curl https://get.openpetra.org > getopenpetra.sh && chmod a+x getopenpetra.sh && sudo -E ./getopenpetra.sh devenv --iknowwhatiamdoing=yes build_script: - echo "building was already done in install section" test_script: From b544586855e910d831ae05a31ddb56bf4ef85dd9 Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Sat, 21 Aug 2021 22:31:33 +0200 Subject: [PATCH 21/58] we are not supporting sqlite for quite a long time anymore --- .../linuxserver/sqlite/OpenPetra.build.config | 7 ------- setup/petra0300/linuxserver/sqlite/openpetra.service | 11 ----------- 2 files changed, 18 deletions(-) delete mode 100644 setup/petra0300/linuxserver/sqlite/OpenPetra.build.config delete mode 100644 setup/petra0300/linuxserver/sqlite/openpetra.service diff --git a/setup/petra0300/linuxserver/sqlite/OpenPetra.build.config b/setup/petra0300/linuxserver/sqlite/OpenPetra.build.config deleted file mode 100644 index 9385d60237..0000000000 --- a/setup/petra0300/linuxserver/sqlite/OpenPetra.build.config +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/setup/petra0300/linuxserver/sqlite/openpetra.service b/setup/petra0300/linuxserver/sqlite/openpetra.service deleted file mode 100644 index 93c9e9d23a..0000000000 --- a/setup/petra0300/linuxserver/sqlite/openpetra.service +++ /dev/null @@ -1,11 +0,0 @@ -[Unit] -Description=OpenPetra Server - -[Service] -User=OPENPETRA_USER -ExecStart=OPENPETRA_SERVER_BIN start -ExecStop=OPENPETRA_SERVER_BIN stop -RestartSec=5 - -[Install] -WantedBy=multi-user.target From 67fb8b571059f5f18c3fec77963a00bd0f4436da Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Thu, 26 Aug 2021 20:29:34 +0200 Subject: [PATCH 22/58] find the correct path of wkhtmltopdf, also on Debian --- csharp/ICT/Common/Printing/Html2Pdf.cs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/csharp/ICT/Common/Printing/Html2Pdf.cs b/csharp/ICT/Common/Printing/Html2Pdf.cs index 3f067cf468..a803290ebc 100644 --- a/csharp/ICT/Common/Printing/Html2Pdf.cs +++ b/csharp/ICT/Common/Printing/Html2Pdf.cs @@ -78,7 +78,18 @@ public static bool HTMLToPDF(string AHtmlText, string AOutputPDFFilename) } Process process = new Process(); - process.StartInfo.FileName = TAppSettingsManager.GetValue("wkhtmltopdf.Path", "/usr/local/bin/wkhtmltopdf"); + process.StartInfo.FileName = TAppSettingsManager.GetValue("wkhtmltopdf.Path", "/usr/bin/wkhtmltopdf"); + + if (!File.Exists(process.StartInfo.FileName)) + { + process.StartInfo.FileName = "/usr/local/bin/wkhtmltopdf"; + } + + if (!File.Exists(process.StartInfo.FileName)) + { + throw new Exception("Cannot find wkhtmltopdf. Please set wkhtmltopdf.Path in the config file"); + } + process.StartInfo.Arguments = HTMLFile + " " + AOutputPDFFilename; process.Start(); process.WaitForExit(); From 023384f44f557cc04f429ce7c065c0194e4992b0 Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Thu, 26 Aug 2021 20:54:48 +0200 Subject: [PATCH 23/58] find config file on shared hosting for multi tenant --- .../ICT/Petra/Server/app/WebService/SessionManager.cs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/csharp/ICT/Petra/Server/app/WebService/SessionManager.cs b/csharp/ICT/Petra/Server/app/WebService/SessionManager.cs index 172e87aba8..541eb11532 100644 --- a/csharp/ICT/Petra/Server/app/WebService/SessionManager.cs +++ b/csharp/ICT/Petra/Server/app/WebService/SessionManager.cs @@ -94,8 +94,6 @@ public TOpenPetraOrgSessionManager() : base() /// private static bool Init() { - string ConfigFileName = string.Empty; - // make sure the correct config file is used string Instance = HttpContext.Current.Request.Url.ToString().Replace("http://", "").Replace("https://", ""); Instance = Instance.Substring(0, Instance.IndexOf(".")).Replace("op_","op").Replace("op", "op_"); @@ -106,7 +104,13 @@ private static bool Init() Instance = "op_" + Instance; } - ConfigFileName = "/home/" + Instance + "/etc/PetraServerConsole.config"; + string ConfigFileName = "/home/" + Instance + "/etc/PetraServerConsole.config"; + + if (!File.Exists(ConfigFileName)) + { + // multi tenant on shared hosting + ConfigFileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "instances") + "/" + Instance + "/etc/PetraServerConsole.config"; + } if (File.Exists(ConfigFileName)) { From 6dd75f653fc0b0a0974a53936e1b5574e18760e0 Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Fri, 27 Aug 2021 06:04:22 +0200 Subject: [PATCH 24/58] support single tenant on shared hosting --- csharp/ICT/Petra/Server/app/WebService/SessionManager.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/csharp/ICT/Petra/Server/app/WebService/SessionManager.cs b/csharp/ICT/Petra/Server/app/WebService/SessionManager.cs index 541eb11532..7d356e8350 100644 --- a/csharp/ICT/Petra/Server/app/WebService/SessionManager.cs +++ b/csharp/ICT/Petra/Server/app/WebService/SessionManager.cs @@ -112,6 +112,12 @@ private static bool Init() ConfigFileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "instances") + "/" + Instance + "/etc/PetraServerConsole.config"; } + if (!File.Exists(ConfigFileName)) + { + // single tenant on shared hosting + ConfigFileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), Instance) + "/etc/PetraServerConsole.config"; + } + if (File.Exists(ConfigFileName)) { // we are in a multi tenant hosting scenario From b42184160ff131c901c48863f149b9a1c1a5a2fe Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Fri, 27 Aug 2021 06:57:15 +0200 Subject: [PATCH 25/58] include the pkg_version.txt in the binary tarball --- setup/setup.build | 1 + 1 file changed, 1 insertion(+) diff --git a/setup/setup.build b/setup/setup.build index 3c88918bfd..0a3fe0e124 100644 --- a/setup/setup.build +++ b/setup/setup.build @@ -99,6 +99,7 @@ ${ReleaseVersion} + From 42d9b7ea92969d3096611d2184afd86f8d826a43 Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Fri, 27 Aug 2021 07:15:56 +0200 Subject: [PATCH 26/58] fix previous commit --- setup/setup.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup/setup.build b/setup/setup.build index 0a3fe0e124..9b309bd82f 100644 --- a/setup/setup.build +++ b/setup/setup.build @@ -99,7 +99,7 @@ ${ReleaseVersion} - + From c4c9586a168b64ba8c64edbbedd973759cefdfdc Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Sat, 28 Aug 2021 16:45:41 +0200 Subject: [PATCH 27/58] upgrade nuget packages --- csharp/ThirdParty/packages.config | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/csharp/ThirdParty/packages.config b/csharp/ThirdParty/packages.config index 801638a56b..93b1b752ca 100644 --- a/csharp/ThirdParty/packages.config +++ b/csharp/ThirdParty/packages.config @@ -5,7 +5,7 @@ - + @@ -17,15 +17,15 @@ - - + + - + - + From a2170562a9073aa5f3779b86990cf6191329a2c1 Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Sat, 28 Aug 2021 20:53:36 +0200 Subject: [PATCH 28/58] npm update && npm audit fix --- js-client/package-lock.json | 18 +++++++++--------- js-client/package.json | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/js-client/package-lock.json b/js-client/package-lock.json index b317fb1d35..05c8657a1b 100644 --- a/js-client/package-lock.json +++ b/js-client/package-lock.json @@ -93,9 +93,9 @@ } }, "@fortawesome/fontawesome-free": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.3.tgz", - "integrity": "sha512-rFnSUN/QOtnOAgqFRooTA3H57JLDm0QEG/jPdk+tLQNL/eWd+Aok8g3qCI+Q1xuDPWpGW/i9JySpJVsq8Q0s9w==" + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz", + "integrity": "sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg==" }, "@samverschueren/stream-to-observable": { "version": "0.3.1", @@ -2243,9 +2243,9 @@ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" }, "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "path-platform": { "version": "0.11.15", @@ -2823,9 +2823,9 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "uglify-js": { - "version": "3.13.6", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.6.tgz", - "integrity": "sha512-rRprLwl8RVaS+Qvx3Wh5hPfPBn9++G6xkGlUupya0s5aDmNjI7z3lnRLB3u7sN4OmbB0pWgzhM9BEJyiWAwtAA==" + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.1.tgz", + "integrity": "sha512-JhS3hmcVaXlp/xSo3PKY5R0JqKs5M3IV+exdLHW99qKvKivPO4Z8qbej6mte17SOPqAOVMjt/XGgWacnFSzM3g==" }, "umd": { "version": "3.0.3", diff --git a/js-client/package.json b/js-client/package.json index 6b7e709cfe..fbaf404672 100644 --- a/js-client/package.json +++ b/js-client/package.json @@ -4,7 +4,7 @@ "description": "Client for OpenPetra running in the web browser", "main": "index.js", "dependencies": { - "@fortawesome/fontawesome-free": "^5.15.3", + "@fortawesome/fontawesome-free": "^5.15.4", "axios": "^0.21.1", "bootstrap": "^4.6.0", "browserify": "^16.5.2", @@ -15,7 +15,7 @@ "i18next-xhr-backend": "^1.5.1", "jquery": "^3.6.0", "popper.js": "^1.16.1", - "uglify-js": "^3.13.6" + "uglify-js": "^3.14.1" }, "devDependencies": {}, "scripts": { From 16d6bbb2f2fcafb470409081b587b782cd51bd9c Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Sat, 28 Aug 2021 21:43:01 +0200 Subject: [PATCH 29/58] small refactoring of server script for upgrading databases in shared hosting --- .../petra0300/linuxserver/openpetra-server.sh | 61 ++++++++++--------- 1 file changed, 32 insertions(+), 29 deletions(-) diff --git a/setup/petra0300/linuxserver/openpetra-server.sh b/setup/petra0300/linuxserver/openpetra-server.sh index 6d4cfb5541..02c90e7a4f 100755 --- a/setup/petra0300/linuxserver/openpetra-server.sh +++ b/setup/petra0300/linuxserver/openpetra-server.sh @@ -36,14 +36,15 @@ generatepwd() { } getConfigOfCurrentCustomer() { - config=$userHome/etc/PetraServerConsole.config - if [ ! -f $config ] + if [ "$Command" = "init" ] then - config=$HOME/etc/PetraServerConsole.config + return 0 fi + + config=$userHome/etc/PetraServerConsole.config if [ ! -f $config ] then - config=/home/$OP_CUSTOMER/etc/PetraServerConsole.config + config=$HOME/etc/PetraServerConsole.config fi if [ -f $config ] then @@ -68,17 +69,25 @@ getConfigOfCurrentCustomer() { echo "cannot find $config" exit -1 fi +} - # in older versions, we did not have the port in the PetraServerConsole.config file - if [ -z "$OPENPETRA_HTTP_PORT" ] - then - if [ -f /etc/nginx/conf.d/$OP_CUSTOMER.conf ] +runAsUser() { + cmd=$1 + + if [ $userHome = "/home/$userName" ] then - export OPENPETRA_HTTP_PORT=`cat /etc/nginx/conf.d/$OP_CUSTOMER.conf | grep -m1 listen | sed -e 's#;##' | awk -F' ' '{print $2}'` + su $userName -c "$cmd" || exit -1 + elif [ "`whoami`" = "$userName" ] + then + bash -c "$cmd" || exit -1 + elif [ -f $userHome/etc/PetraServerConsole.config ] + then + bash -c "$cmd" || exit -1 fi - fi } +Command="$1" + if [ -z "$OP_CUSTOMER" ] then # check if the current user starts with op_ @@ -98,14 +107,22 @@ then dirname=`dirname $THIS_SCRIPT` export userName=`basename $dirname` fi -elif [ "$1" != "init" ]; then - getConfigOfCurrentCustomer fi -if [ -z $userHome ]; then - export userHome=/home/$OP_CUSTOMER +if [ ! -z "$OP_CUSTOMER" ] +then + if [ -z $userHome ]; then + export userHome=/home/$OP_CUSTOMER + fi + + if [ ! -d $userHome ]; then + export userHome=$HOME/$OP_CUSTOMER + fi + + getConfigOfCurrentCustomer fi + if [ -z "$backupfile" ] then export backupfile=$userHome/backup/backup-`date +%Y%m%d%H`.sql.gz @@ -151,20 +168,6 @@ stop() { fi } -runAsUser() { - cmd=$1 - - if [ -f $userHome/etc/PetraServerConsole.config ] - then - bash -c "$cmd" || exit -1 - elif [ "`whoami`" = "$userName" ] - then - bash -c "$cmd" || exit -1 - else - su $userName -c "$cmd" || exit -1 - fi -} - # load a new database from a yml.gz file. this will overwrite the current database! loadYmlGz() { echo "loading database from $ymlgzfile with config $userHome/etc/PetraServerConsole.config" @@ -706,7 +709,7 @@ upgradedb() { runAsUser "cd $OpenPetraPathBin; mono --runtime=v4.0 --server PetraServerAdminConsole.exe -C:$userHome/etc/PetraServerAdminConsole.config -Command:UpgradeDatabase" } -case "$1" in +case "$Command" in start) start ;; From 797042df720593e4393525ee4a0c0d69c8e6de6a Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Mon, 30 Aug 2021 10:16:17 +0200 Subject: [PATCH 30/58] fix userHome for openpetra-server.sh init --- setup/petra0300/linuxserver/openpetra-server.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/setup/petra0300/linuxserver/openpetra-server.sh b/setup/petra0300/linuxserver/openpetra-server.sh index 02c90e7a4f..d93ace64ce 100755 --- a/setup/petra0300/linuxserver/openpetra-server.sh +++ b/setup/petra0300/linuxserver/openpetra-server.sh @@ -475,6 +475,7 @@ init() { fi userName=$OP_CUSTOMER + userHome=/home/$OP_CUSTOMER if [ -f $userHome/etc/PetraServerConsole.config ] then From bcbce223103e89dd140158aeae57a280f1040849 Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Mon, 30 Aug 2021 10:18:26 +0200 Subject: [PATCH 31/58] move setup/petra0300/* to setup --- setup/{petra0300 => }/linuxserver/INSTALL | 0 .../linuxserver/PetraServerAdminConsole.config | 0 .../linuxserver/PetraServerConsole.config | 0 setup/{petra0300 => }/linuxserver/common.config | 0 .../linuxserver/mysql/OpenPetra.build.config | 0 .../linuxserver/mysql/openpetra.service | 0 setup/{petra0300 => }/linuxserver/nginx.conf | 0 .../linuxserver/openpetra-server.sh | 0 .../postgresql/OpenPetra.build.config | 0 .../linuxserver/postgresql/openpetra.service | 0 setup/{petra0300 => }/linuxserver/web.config | 0 .../releasenotes/releasenotes.html | 0 .../releasenotes/releasenotes_de.html | 0 setup/setup.build | 17 ++++++++--------- 14 files changed, 8 insertions(+), 9 deletions(-) rename setup/{petra0300 => }/linuxserver/INSTALL (100%) rename setup/{petra0300 => }/linuxserver/PetraServerAdminConsole.config (100%) rename setup/{petra0300 => }/linuxserver/PetraServerConsole.config (100%) rename setup/{petra0300 => }/linuxserver/common.config (100%) rename setup/{petra0300 => }/linuxserver/mysql/OpenPetra.build.config (100%) rename setup/{petra0300 => }/linuxserver/mysql/openpetra.service (100%) rename setup/{petra0300 => }/linuxserver/nginx.conf (100%) rename setup/{petra0300 => }/linuxserver/openpetra-server.sh (100%) rename setup/{petra0300 => }/linuxserver/postgresql/OpenPetra.build.config (100%) rename setup/{petra0300 => }/linuxserver/postgresql/openpetra.service (100%) rename setup/{petra0300 => }/linuxserver/web.config (100%) rename setup/{petra0300 => }/releasenotes/releasenotes.html (100%) rename setup/{petra0300 => }/releasenotes/releasenotes_de.html (100%) diff --git a/setup/petra0300/linuxserver/INSTALL b/setup/linuxserver/INSTALL similarity index 100% rename from setup/petra0300/linuxserver/INSTALL rename to setup/linuxserver/INSTALL diff --git a/setup/petra0300/linuxserver/PetraServerAdminConsole.config b/setup/linuxserver/PetraServerAdminConsole.config similarity index 100% rename from setup/petra0300/linuxserver/PetraServerAdminConsole.config rename to setup/linuxserver/PetraServerAdminConsole.config diff --git a/setup/petra0300/linuxserver/PetraServerConsole.config b/setup/linuxserver/PetraServerConsole.config similarity index 100% rename from setup/petra0300/linuxserver/PetraServerConsole.config rename to setup/linuxserver/PetraServerConsole.config diff --git a/setup/petra0300/linuxserver/common.config b/setup/linuxserver/common.config similarity index 100% rename from setup/petra0300/linuxserver/common.config rename to setup/linuxserver/common.config diff --git a/setup/petra0300/linuxserver/mysql/OpenPetra.build.config b/setup/linuxserver/mysql/OpenPetra.build.config similarity index 100% rename from setup/petra0300/linuxserver/mysql/OpenPetra.build.config rename to setup/linuxserver/mysql/OpenPetra.build.config diff --git a/setup/petra0300/linuxserver/mysql/openpetra.service b/setup/linuxserver/mysql/openpetra.service similarity index 100% rename from setup/petra0300/linuxserver/mysql/openpetra.service rename to setup/linuxserver/mysql/openpetra.service diff --git a/setup/petra0300/linuxserver/nginx.conf b/setup/linuxserver/nginx.conf similarity index 100% rename from setup/petra0300/linuxserver/nginx.conf rename to setup/linuxserver/nginx.conf diff --git a/setup/petra0300/linuxserver/openpetra-server.sh b/setup/linuxserver/openpetra-server.sh similarity index 100% rename from setup/petra0300/linuxserver/openpetra-server.sh rename to setup/linuxserver/openpetra-server.sh diff --git a/setup/petra0300/linuxserver/postgresql/OpenPetra.build.config b/setup/linuxserver/postgresql/OpenPetra.build.config similarity index 100% rename from setup/petra0300/linuxserver/postgresql/OpenPetra.build.config rename to setup/linuxserver/postgresql/OpenPetra.build.config diff --git a/setup/petra0300/linuxserver/postgresql/openpetra.service b/setup/linuxserver/postgresql/openpetra.service similarity index 100% rename from setup/petra0300/linuxserver/postgresql/openpetra.service rename to setup/linuxserver/postgresql/openpetra.service diff --git a/setup/petra0300/linuxserver/web.config b/setup/linuxserver/web.config similarity index 100% rename from setup/petra0300/linuxserver/web.config rename to setup/linuxserver/web.config diff --git a/setup/petra0300/releasenotes/releasenotes.html b/setup/releasenotes/releasenotes.html similarity index 100% rename from setup/petra0300/releasenotes/releasenotes.html rename to setup/releasenotes/releasenotes.html diff --git a/setup/petra0300/releasenotes/releasenotes_de.html b/setup/releasenotes/releasenotes_de.html similarity index 100% rename from setup/petra0300/releasenotes/releasenotes_de.html rename to setup/releasenotes/releasenotes_de.html diff --git a/setup/setup.build b/setup/setup.build index 9b309bd82f..895174dcfb 100644 --- a/setup/setup.build +++ b/setup/setup.build @@ -5,7 +5,6 @@ - @@ -121,7 +120,7 @@ - + @@ -146,11 +145,11 @@ - - + @@ -159,9 +158,9 @@ - - @@ -185,7 +184,7 @@ commandline="-c "curl --silent --location https://github.com/openpetra/demo-databases/raw/master/clean.yml.gz > clean.yml.gz"" /> - @@ -197,7 +196,7 @@ - @@ -210,7 +209,7 @@ tofile="${dir.setup}/db/demodata-MySQL.sql"/> - From 3bb1fb95af44e44be7c50123c2f9a23fcfa6121d Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Thu, 2 Sep 2021 12:09:23 +0200 Subject: [PATCH 32/58] one single place to determine the location of wkhtmltopdf binary --- csharp/ICT/Common/Printing/Html2Pdf.cs | 33 ++++++++++++------- .../lib/MFinance/Gift/Gift.Receipting.cs | 2 +- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/csharp/ICT/Common/Printing/Html2Pdf.cs b/csharp/ICT/Common/Printing/Html2Pdf.cs index a803290ebc..9bc0a17f12 100644 --- a/csharp/ICT/Common/Printing/Html2Pdf.cs +++ b/csharp/ICT/Common/Printing/Html2Pdf.cs @@ -33,6 +33,26 @@ namespace Ict.Common.Printing /// usw wkhtmltopdf to print HTML to PDF public class Html2Pdf { + /// get the path to the wkhtmltopdf binary + public static string GetWkHTMLToPDFPath() + { + // Debian + string wkhtmltopdf = TAppSettingsManager.GetValue("wkhtmltopdf.Path", "/usr/bin/wkhtmltopdf"); + + if (!File.Exists(wkhtmltopdf)) + { + // CentOS + wkhtmltopdf = "/usr/local/bin/wkhtmltopdf"; + } + + if (!File.Exists(wkhtmltopdf)) + { + throw new Exception("Cannot find wkhtmltopdf. Please set wkhtmltopdf.Path in the config file"); + } + + return wkhtmltopdf; + } + /// /// Create a PDF file from the HTML /// @@ -78,18 +98,7 @@ public static bool HTMLToPDF(string AHtmlText, string AOutputPDFFilename) } Process process = new Process(); - process.StartInfo.FileName = TAppSettingsManager.GetValue("wkhtmltopdf.Path", "/usr/bin/wkhtmltopdf"); - - if (!File.Exists(process.StartInfo.FileName)) - { - process.StartInfo.FileName = "/usr/local/bin/wkhtmltopdf"; - } - - if (!File.Exists(process.StartInfo.FileName)) - { - throw new Exception("Cannot find wkhtmltopdf. Please set wkhtmltopdf.Path in the config file"); - } - + process.StartInfo.FileName = GetWkHTMLToPDFPath(); process.StartInfo.Arguments = HTMLFile + " " + AOutputPDFFilename; process.Start(); process.WaitForExit(); diff --git a/csharp/ICT/Petra/Server/lib/MFinance/Gift/Gift.Receipting.cs b/csharp/ICT/Petra/Server/lib/MFinance/Gift/Gift.Receipting.cs index 9e215b0fe3..93a4b8c6d4 100644 --- a/csharp/ICT/Petra/Server/lib/MFinance/Gift/Gift.Receipting.cs +++ b/csharp/ICT/Petra/Server/lib/MFinance/Gift/Gift.Receipting.cs @@ -323,7 +323,7 @@ public class TReceiptingWebConnector } Process process = new Process(); - process.StartInfo.FileName = TAppSettingsManager.GetValue("wkhtmltopdf.Path", "/usr/local/bin/wkhtmltopdf"); + process.StartInfo.FileName = Html2Pdf.GetWkHTMLToPDFPath(); process.StartInfo.Arguments = HTMLFile + " " + AOutputPDFFilename; process.Start(); process.WaitForExit(); From d1536580aa4146feed6860905fa190d8eb4795e1 Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Tue, 7 Sep 2021 20:07:55 +0200 Subject: [PATCH 33/58] licenseuser can be defined in the config file useful if dbname is not equals instance name in a shared hosting environment --- csharp/ICT/Petra/Server/lib/MSysMan/UserManager.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/csharp/ICT/Petra/Server/lib/MSysMan/UserManager.cs b/csharp/ICT/Petra/Server/lib/MSysMan/UserManager.cs index c418f6febe..1ded1a4186 100644 --- a/csharp/ICT/Petra/Server/lib/MSysMan/UserManager.cs +++ b/csharp/ICT/Petra/Server/lib/MSysMan/UserManager.cs @@ -4,7 +4,7 @@ // @Authors: // christiank, timop // -// Copyright 2004-2020 by OM International +// Copyright 2004-2021 by OM International // // This file is part of OpenPetra.org. // @@ -362,7 +362,12 @@ private static void CheckDatabaseVersion(TDataBase ADataBase) if ((LicenseCheckUrl != String.Empty) && (LicenseUser != "openpetra")) { - string url = LicenseCheckUrl + LicenseUser; + string url = LicenseCheckUrl; + + if (url.EndsWith('=')) + { + url += LicenseUser; + } string result = THTTPUtils.ReadWebsite(url); From 6666b5ad6cf244646a51948e689370d98c0a1bb6 Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Fri, 10 Sep 2021 21:36:48 +0200 Subject: [PATCH 34/58] openpetra server script: restore mysql databases in shared environment, without root user --- setup/linuxserver/openpetra-server.sh | 41 +++++++++++---------------- 1 file changed, 17 insertions(+), 24 deletions(-) diff --git a/setup/linuxserver/openpetra-server.sh b/setup/linuxserver/openpetra-server.sh index d93ace64ce..45a9db439b 100755 --- a/setup/linuxserver/openpetra-server.sh +++ b/setup/linuxserver/openpetra-server.sh @@ -235,34 +235,27 @@ FINISH # restore the mysql database mysqlrestore() { - if [ -z "$MYSQL_ROOT_PWD" ]; then - echo "missing MYSQL_ROOT_PWD environment variable" - exit -1 - fi - echo "This will overwrite your database!!!" - echo "Please enter 'yes' if that is ok:" - read response - if [ "$response" != 'yes' ] - then - echo "Cancelled the restore" - exit + + if [[ "$IKNOWWHATIAMDOING" != "YES" ]]; then + echo "Please enter 'yes' if that is ok:" + read response + if [ "$response" != 'yes' ] + then + echo "Cancelled the restore" + exit + fi fi echo `date` "Start restoring from " $backupfile - echo "creating database..." - - echo "DROP DATABASE IF EXISTS \`$OPENPETRA_DBNAME\`;" > $OpenPetraPath/tmp/createtables-MySQL.sql - echo "CREATE DATABASE IF NOT EXISTS \`$OPENPETRA_DBNAME\`;" >> $OpenPetraPath/tmp/createtables-MySQL.sql - echo "USE \`$OPENPETRA_DBNAME\`;" >> $OpenPetraPath/tmp/createtables-MySQL.sql - cat $OpenPetraPath/db/createtables-MySQL.sql >> $OpenPetraPath/tmp/createtables-MySQL.sql - # CREATE USER IF NOT EXISTS does not work yet on CentOS7 with mariadb 5.5 - #echo "CREATE USER IF NOT EXISTS '$OPENPETRA_DBUSER'@'localhost' IDENTIFIED BY '$OPENPETRA_DBPWD';" >> $OpenPetraPath/tmp/createtables-MySQL.sql - echo "GRANT ALL ON \`$OPENPETRA_DBNAME\`.* TO \`$OPENPETRA_DBUSER\`@\`localhost\`" >> $OpenPetraPath/tmp/createtables-MySQL.sql - mysql -u root --host=$OPENPETRA_DBHOST --port=$OPENPETRA_DBPORT --password="$MYSQL_ROOT_PWD" < $OpenPetraPath/tmp/createtables-MySQL.sql - rm $OpenPetraPath/tmp/createtables-MySQL.sql - - echo "loading data and constraints and indexes..." + echo "deleting database..." + echo "SET FOREIGN_KEY_CHECKS = 0;" > $userHome/tmp/clean.sql + mysqldump --add-drop-table --no-data -u $OPENPETRA_DBUSER --password="$OPENPETRA_DBPWD" --host=$OPENPETRA_DBHOST --port=$OPENPETRA_DBPORT $OPENPETRA_DBNAME | grep 'DROP TABLE' >> $userHome/tmp/clean.sql + echo "SET FOREIGN_KEY_CHECKS = 1;" >> $userHome/tmp/clean.sql + mysql -u $OPENPETRA_DBUSER --password="$OPENPETRA_DBPWD" --host=$OPENPETRA_DBHOST --port=$OPENPETRA_DBPORT $OPENPETRA_DBNAME < $userHome/tmp/clean.sql + rm $userHome/tmp/clean.sql + + echo "loading data..." echo $backupfile|grep -qE '\.gz$' if [ $? -eq 0 ] then From afec04243f9d97ded44e792565bab33fa98635a4 Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Fri, 10 Sep 2021 21:45:00 +0200 Subject: [PATCH 35/58] openpetra server script: allow to define OP_HOME that hosts the instances --- setup/linuxserver/openpetra-server.sh | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/setup/linuxserver/openpetra-server.sh b/setup/linuxserver/openpetra-server.sh index 45a9db439b..d221058ea5 100755 --- a/setup/linuxserver/openpetra-server.sh +++ b/setup/linuxserver/openpetra-server.sh @@ -88,6 +88,11 @@ runAsUser() { Command="$1" +if [ -z "$OP_HOME" ] +then + export OP_HOME="/home" +fi + if [ -z "$OP_CUSTOMER" ] then # check if the current user starts with op_ @@ -195,7 +200,7 @@ sendReminders() { } sendRemindersAll() { - for d in /home/$OPENPETRA_USER_PREFIX*; do + for d in $OP_HOME/$OPENPETRA_USER_PREFIX*; do if [ -d $d ]; then export OP_CUSTOMER=`basename $d` $THIS_SCRIPT reminder @@ -331,7 +336,7 @@ backup() { } backupall() { - for d in /home/$OPENPETRA_USER_PREFIX*; do + for d in $OP_HOME/$OPENPETRA_USER_PREFIX*; do if [ -d $d ]; then export OP_CUSTOMER=`basename $d` export backupfile=$userHome/backup/backup-`date +%Y%m%d%H`.sql.gz @@ -406,7 +411,7 @@ updateall() { systemctl restart openpetra - for d in /home/$OPENPETRA_USER_PREFIX*; do + for d in $OP_HOME/$OPENPETRA_USER_PREFIX*; do if [ -d $d ]; then export OP_CUSTOMER=`basename $d` $THIS_SCRIPT upgradedb @@ -425,7 +430,7 @@ rewrite_conf() { fi if [ -z $OP_CUSTOMER ]; then - for d in /home/$OPENPETRA_USER_PREFIX*; do + for d in $OP_HOME/$OPENPETRA_USER_PREFIX*; do if [ -d $d ]; then export OP_CUSTOMER=`basename $d` rewrite_conf @@ -468,7 +473,7 @@ init() { fi userName=$OP_CUSTOMER - userHome=/home/$OP_CUSTOMER + userHome=$OP_HOME/$OP_CUSTOMER if [ -f $userHome/etc/PetraServerConsole.config ] then From 57cf4ae86037833c90b8781b1771e5a3019467a2 Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Fri, 10 Sep 2021 21:55:39 +0200 Subject: [PATCH 36/58] server script: update to confirmation about restoring database --- setup/linuxserver/openpetra-server.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/setup/linuxserver/openpetra-server.sh b/setup/linuxserver/openpetra-server.sh index d221058ea5..a68f4712e8 100755 --- a/setup/linuxserver/openpetra-server.sh +++ b/setup/linuxserver/openpetra-server.sh @@ -240,9 +240,8 @@ FINISH # restore the mysql database mysqlrestore() { - echo "This will overwrite your database!!!" - if [[ "$IKNOWWHATIAMDOING" != "YES" ]]; then + echo "This will overwrite your database!!!" echo "Please enter 'yes' if that is ok:" read response if [ "$response" != 'yes' ] From 5d4bbd31c041098e65a5a4e2f3ad1fe499c1adaa Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Fri, 10 Sep 2021 22:20:34 +0200 Subject: [PATCH 37/58] openpetra server script: another fix for finding the userHome path --- setup/linuxserver/openpetra-server.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup/linuxserver/openpetra-server.sh b/setup/linuxserver/openpetra-server.sh index a68f4712e8..2f627c62c5 100755 --- a/setup/linuxserver/openpetra-server.sh +++ b/setup/linuxserver/openpetra-server.sh @@ -117,7 +117,7 @@ fi if [ ! -z "$OP_CUSTOMER" ] then if [ -z $userHome ]; then - export userHome=/home/$OP_CUSTOMER + export userHome=$OP_HOME/$OP_CUSTOMER fi if [ ! -d $userHome ]; then From 509c1d7f38f744632f87066a7ec389919af18343 Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Fri, 10 Sep 2021 22:25:32 +0200 Subject: [PATCH 38/58] openpetra server script: improve calculating OP_HOME --- setup/linuxserver/openpetra-server.sh | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/setup/linuxserver/openpetra-server.sh b/setup/linuxserver/openpetra-server.sh index 2f627c62c5..f37f6a2103 100755 --- a/setup/linuxserver/openpetra-server.sh +++ b/setup/linuxserver/openpetra-server.sh @@ -90,7 +90,17 @@ Command="$1" if [ -z "$OP_HOME" ] then - export OP_HOME="/home" + if [ -d $HOME/instances ]; then + export OP_HOME="$HOME/instances" + else + export OP_HOME="/home" + fi + + if [ ! -z "$OP_CUSTOMER" ]; then + if [ -d $HOME/$OP_CUSTOMER ]; then + export OP_HOME="$HOME" + fi + fi fi if [ -z "$OP_CUSTOMER" ] From c65cbd312628af358dd453838c1dc4df554fc3fd Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Sat, 11 Sep 2021 06:25:32 +0200 Subject: [PATCH 39/58] server script: add FORCE_BACKUP option to backupall for moving all databases to other server --- setup/linuxserver/openpetra-server.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup/linuxserver/openpetra-server.sh b/setup/linuxserver/openpetra-server.sh index f37f6a2103..ce177c0688 100755 --- a/setup/linuxserver/openpetra-server.sh +++ b/setup/linuxserver/openpetra-server.sh @@ -351,7 +351,7 @@ backupall() { export backupfile=$userHome/backup/backup-`date +%Y%m%d%H`.sql.gz # if there is no backup for today yet, just create one - if [ ! -f $userHome/backup/backup-`date +%Y%m%d`00.sql.gz ]; then + if [[ $FORCE_BACKUP -eq 1 || ! -f /home/$OP_CUSTOMER/backup/backup-`date +%Y%m%d`00.sql.gz ]]; then $THIS_SCRIPT backup else # do we have a successful login from outside within the past 7 days? From 976924320c59fc21acbb2cc6291b7853c572496b Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Sat, 11 Sep 2021 08:53:46 +0200 Subject: [PATCH 40/58] new version nuget MySqlConnector 1.3.12 --- csharp/ThirdParty/packages.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csharp/ThirdParty/packages.config b/csharp/ThirdParty/packages.config index 93b1b752ca..0412e1d475 100644 --- a/csharp/ThirdParty/packages.config +++ b/csharp/ThirdParty/packages.config @@ -5,7 +5,7 @@ - + From 43a757c9d3c15d1ed4ae0d6e49d6f7baea62f7c4 Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Mon, 13 Sep 2021 22:29:30 +0200 Subject: [PATCH 41/58] openpetra server script: add environment variable DO_NOT_CREATE_DATABASE for shared hosting --- setup/linuxserver/openpetra-server.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup/linuxserver/openpetra-server.sh b/setup/linuxserver/openpetra-server.sh index ce177c0688..fe071b996e 100755 --- a/setup/linuxserver/openpetra-server.sh +++ b/setup/linuxserver/openpetra-server.sh @@ -585,7 +585,7 @@ init() { mysqlinitdb() { mkdir -p $OpenPetraPath/tmp - if [ "$OPENPETRA_DBHOST" == "localhost" -o "$OPENPETRA_DBHOST" == "127.0.0.1" ] + if [ -z "$DO_NOT_CREATE_DATABASE" ] then if [ -z "$MYSQL_ROOT_PWD" ]; then From ebc3bbf1bff8596758c325d28c8ff344f6d79dd9 Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Mon, 13 Sep 2021 22:34:51 +0200 Subject: [PATCH 42/58] deal with special case that subdomain starts with openpetra OP_CUSTOMER should be op_openpetra --- csharp/ICT/Petra/Server/app/WebService/SessionManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csharp/ICT/Petra/Server/app/WebService/SessionManager.cs b/csharp/ICT/Petra/Server/app/WebService/SessionManager.cs index 7d356e8350..f0de288fa5 100644 --- a/csharp/ICT/Petra/Server/app/WebService/SessionManager.cs +++ b/csharp/ICT/Petra/Server/app/WebService/SessionManager.cs @@ -96,7 +96,7 @@ private static bool Init() { // make sure the correct config file is used string Instance = HttpContext.Current.Request.Url.ToString().Replace("http://", "").Replace("https://", ""); - Instance = Instance.Substring(0, Instance.IndexOf(".")).Replace("op_","op").Replace("op", "op_"); + Instance = Instance.Substring(0, Instance.IndexOf(".")).Replace("openpetra", "OPENPETRA").Replace("op_","op").Replace("op", "op_").ToLower(); // for demo etc if (!Instance.StartsWith("op_")) From 82166d993a046dbd0d6974532a16eacca1776813 Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Tue, 14 Sep 2021 07:09:40 +0200 Subject: [PATCH 43/58] Create New Batch: set Transaction Currency for the client --- csharp/ICT/Petra/Server/lib/MFinance/Common/Common.Posting.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/csharp/ICT/Petra/Server/lib/MFinance/Common/Common.Posting.cs b/csharp/ICT/Petra/Server/lib/MFinance/Common/Common.Posting.cs index 37cae73937..8ddfbb2dd0 100644 --- a/csharp/ICT/Petra/Server/lib/MFinance/Common/Common.Posting.cs +++ b/csharp/ICT/Petra/Server/lib/MFinance/Common/Common.Posting.cs @@ -2949,12 +2949,13 @@ public static GLBatchTDS CreateABatch(Int32 ALedgerNumber, TDataBase ADataBase, #endregion Validate Data - ABatchRow NewRow = MainDS.ABatch.NewRowTyped(true); + GLBatchTDSABatchRow NewRow = MainDS.ABatch.NewRowTyped(true); NewRow.LedgerNumber = ALedgerNumber; MainDS.ALedger[0].LastBatchNumber++; NewRow.BatchNumber = MainDS.ALedger[0].LastBatchNumber; NewRow.BatchPeriod = MainDS.ALedger[0].CurrentPeriod; NewRow.BatchYear = MainDS.ALedger[0].CurrentFinancialYear; + NewRow.TransactionCurrency = MainDS.ALedger[0].BaseCurrency; if (AWithGLJournal) { From 4d21c04093723a0f222a5c0c8746d119b0c096ef Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Tue, 14 Sep 2021 20:23:11 +0200 Subject: [PATCH 44/58] nuget: update MimeKit to 2.15.1 --- csharp/ThirdParty/packages.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csharp/ThirdParty/packages.config b/csharp/ThirdParty/packages.config index 0412e1d475..0afa0728ce 100644 --- a/csharp/ThirdParty/packages.config +++ b/csharp/ThirdParty/packages.config @@ -17,7 +17,7 @@ - + From bd8435b456c71c6ea95547a16e82eadb17209e77 Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Mon, 20 Sep 2021 22:26:10 +0200 Subject: [PATCH 45/58] update nuget package SharpZipLib --- csharp/ThirdParty/packages.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csharp/ThirdParty/packages.config b/csharp/ThirdParty/packages.config index 0afa0728ce..a3b1145d18 100644 --- a/csharp/ThirdParty/packages.config +++ b/csharp/ThirdParty/packages.config @@ -24,7 +24,7 @@ - + From 4d14b4e8d79182815e997c8fd1a4678576820863 Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Wed, 29 Sep 2021 21:43:54 +0200 Subject: [PATCH 46/58] upgrade nuget HtmlAgilityPack 1.11.37 --- csharp/ThirdParty/packages.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csharp/ThirdParty/packages.config b/csharp/ThirdParty/packages.config index a3b1145d18..df6f8b1394 100644 --- a/csharp/ThirdParty/packages.config +++ b/csharp/ThirdParty/packages.config @@ -21,7 +21,7 @@ - + From 08542009e501064f4f6214fa097daef2b456df85 Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Fri, 8 Oct 2021 19:23:09 +0200 Subject: [PATCH 47/58] fixes for mysql backup for shared hosting --- setup/linuxserver/openpetra-server.sh | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/setup/linuxserver/openpetra-server.sh b/setup/linuxserver/openpetra-server.sh index fe071b996e..afb9cade40 100755 --- a/setup/linuxserver/openpetra-server.sh +++ b/setup/linuxserver/openpetra-server.sh @@ -243,8 +243,10 @@ mysqlbackup() { user=$OPENPETRA_DBUSER password="$OPENPETRA_DBPWD" FINISH - chown $userName:$userName $userHome/.my.cnf - runAsUser "mysqldump --host=$OPENPETRA_DBHOST --port=$OPENPETRA_DBPORT --user=$OPENPETRA_DBUSER $OPENPETRA_DBNAME | gzip > $backupfile" + if [ $userHome = "/home/$userName" ]; then + chown $userName:$userName $userHome/.my.cnf + fi + runAsUser "mysqldump --defaults-extra-file=$userHome/.my.cnf --host=$OPENPETRA_DBHOST --port=$OPENPETRA_DBPORT --user=$OPENPETRA_DBUSER $OPENPETRA_DBNAME | gzip > $backupfile" echo `date` "Finished!" } @@ -348,10 +350,11 @@ backupall() { for d in $OP_HOME/$OPENPETRA_USER_PREFIX*; do if [ -d $d ]; then export OP_CUSTOMER=`basename $d` + export userHome=$OP_HOME/$OP_CUSTOMER export backupfile=$userHome/backup/backup-`date +%Y%m%d%H`.sql.gz # if there is no backup for today yet, just create one - if [[ $FORCE_BACKUP -eq 1 || ! -f /home/$OP_CUSTOMER/backup/backup-`date +%Y%m%d`00.sql.gz ]]; then + if [[ $FORCE_BACKUP -eq 1 || ! -f $userHome/backup/backup-`date +%Y%m%d`00.sql.gz ]]; then $THIS_SCRIPT backup else # do we have a successful login from outside within the past 7 days? From 388f46fa3baaba2c2d3b649b224844abacf665e5 Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Fri, 8 Oct 2021 19:40:05 +0200 Subject: [PATCH 48/58] do not pass the mysql password on the command line, but use my.cnf instead --- setup/linuxserver/openpetra-server.sh | 33 ++++++++++++++++----------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/setup/linuxserver/openpetra-server.sh b/setup/linuxserver/openpetra-server.sh index afb9cade40..e6e8c06326 100755 --- a/setup/linuxserver/openpetra-server.sh +++ b/setup/linuxserver/openpetra-server.sh @@ -218,6 +218,14 @@ sendRemindersAll() { done } +writeMySqlPwd() { + cat > $userHome/.my.cnf < $userHome/.my.cnf < $userHome/tmp/clean.sql - mysqldump --add-drop-table --no-data -u $OPENPETRA_DBUSER --password="$OPENPETRA_DBPWD" --host=$OPENPETRA_DBHOST --port=$OPENPETRA_DBPORT $OPENPETRA_DBNAME | grep 'DROP TABLE' >> $userHome/tmp/clean.sql + mysqldump --add-drop-table --no-data -u $OPENPETRA_DBUSER --defaults-extra-file=$userHome/.my.cnf --host=$OPENPETRA_DBHOST --port=$OPENPETRA_DBPORT $OPENPETRA_DBNAME | grep 'DROP TABLE' >> $userHome/tmp/clean.sql echo "SET FOREIGN_KEY_CHECKS = 1;" >> $userHome/tmp/clean.sql - mysql -u $OPENPETRA_DBUSER --password="$OPENPETRA_DBPWD" --host=$OPENPETRA_DBHOST --port=$OPENPETRA_DBPORT $OPENPETRA_DBNAME < $userHome/tmp/clean.sql + mysql -u $OPENPETRA_DBUSER --defaults-extra-file=$userHome/.my.cnf --host=$OPENPETRA_DBHOST --port=$OPENPETRA_DBPORT $OPENPETRA_DBNAME < $userHome/tmp/clean.sql rm $userHome/tmp/clean.sql echo "loading data..." echo $backupfile|grep -qE '\.gz$' if [ $? -eq 0 ] then - cat $backupfile | gunzip | mysql -u $OPENPETRA_DBUSER --password="$OPENPETRA_DBPWD" --host=$OPENPETRA_DBHOST --port=$OPENPETRA_DBPORT $OPENPETRA_DBNAME > $userHome/log/mysqlload.log + cat $backupfile | gunzip | mysql -u $OPENPETRA_DBUSER --defaults-extra-file=$userHome/.my.cnf --host=$OPENPETRA_DBHOST --port=$OPENPETRA_DBPORT $OPENPETRA_DBNAME > $userHome/log/mysqlload.log else - mysql -u $OPENPETRA_DBUSER --password="$OPENPETRA_DBPWD" --host=$OPENPETRA_DBHOST --port=$OPENPETRA_DBPORT $OPENPETRA_DBNAME < $backupfile > $userHome/log/mysqlload.log + mysql -u $OPENPETRA_DBUSER --defaults-extra-file=$userHome/.my.cnf --host=$OPENPETRA_DBHOST --port=$OPENPETRA_DBPORT $OPENPETRA_DBNAME < $backupfile > $userHome/log/mysqlload.log fi echo `date` "Finished!" @@ -606,7 +611,8 @@ mysqlinitdb() { rm -f $OpenPetraPath/tmp/createdb-MySQL.sql fi echo "creating tables..." - mysql -u $OPENPETRA_DBUSER --password="$OPENPETRA_DBPWD" --host=$OPENPETRA_DBHOST --port=$OPENPETRA_DBPORT $OPENPETRA_DBNAME < $OpenPetraPath/db/createdb-MySQL.sql + writeMySqlPwd + mysql -u $OPENPETRA_DBUSER --defaults-extra-file=$userHome/.my.cnf --host=$OPENPETRA_DBHOST --port=$OPENPETRA_DBPORT $OPENPETRA_DBNAME < $OpenPetraPath/db/createdb-MySQL.sql echo "initial data..." # insert initial data so that loadymlgz will work @@ -616,7 +622,7 @@ insert into s_module(s_module_id_c) values ('SYSMAN'); insert into s_user_module_access_permission(s_user_id_c, s_module_id_c, s_can_access_l) values('SYSADMIN', 'SYSMAN', true); insert into s_system_status (s_user_id_c, s_system_login_status_l) values ('SYSADMIN', true); FINISH - mysql -u $OPENPETRA_DBUSER --password="$OPENPETRA_DBPWD" --host=$OPENPETRA_DBHOST --port=$OPENPETRA_DBPORT $OPENPETRA_DBNAME < $OpenPetraPath/tmp/init-MySQL.sql + mysql -u $OPENPETRA_DBUSER --defaults-extra-file=$userHome/.my.cnf --host=$OPENPETRA_DBHOST --port=$OPENPETRA_DBPORT $OPENPETRA_DBNAME < $OpenPetraPath/tmp/init-MySQL.sql } # this will overwrite all existing data @@ -695,9 +701,10 @@ initdb() { # if url does not start with demo. if [[ ! $OPENPETRA_HTTP_URL == https://demo.* && ! $OPENPETRA_HTTP_URL == http://demo.* ]] then - mysql -u $OPENPETRA_DBUSER --password="$OPENPETRA_DBPWD" --host=$OPENPETRA_DBHOST --port=$OPENPETRA_DBPORT \ + writeMySqlPwd + mysql -u $OPENPETRA_DBUSER --defaults-extra-file=$userHome/.my.cnf --host=$OPENPETRA_DBHOST --port=$OPENPETRA_DBPORT \ -e "UPDATE s_user SET s_password_needs_change_l = 1 WHERE s_user_id_c = 'SYSADMIN'" $OPENPETRA_DBNAME - mysql -u $OPENPETRA_DBUSER --password="$OPENPETRA_DBPWD" --host=$OPENPETRA_DBHOST --port=$OPENPETRA_DBPORT \ + mysql -u $OPENPETRA_DBUSER --defaults-extra-file=$userHome/.my.cnf --host=$OPENPETRA_DBHOST --port=$OPENPETRA_DBPORT \ -e "DELETE FROM s_user WHERE s_user_id_c <> 'SYSADMIN'" $OPENPETRA_DBNAME fi From 51e4a08c8602609028497bff20b078547ba0c718 Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Fri, 8 Oct 2021 22:01:52 +0200 Subject: [PATCH 49/58] more fixes for my.cnf. fix for runAsUser --- setup/linuxserver/openpetra-server.sh | 40 +++++++++++++++++---------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/setup/linuxserver/openpetra-server.sh b/setup/linuxserver/openpetra-server.sh index e6e8c06326..6fade6d6c3 100755 --- a/setup/linuxserver/openpetra-server.sh +++ b/setup/linuxserver/openpetra-server.sh @@ -74,12 +74,12 @@ getConfigOfCurrentCustomer() { runAsUser() { cmd=$1 - if [ $userHome = "/home/$userName" ] - then - su $userName -c "$cmd" || exit -1 - elif [ "`whoami`" = "$userName" ] + if [ "`whoami`" = "$userName" ] then bash -c "$cmd" || exit -1 + elif [ $userHome = "/home/$userName" ] + then + su $userName -c "$cmd" || exit -1 elif [ -f $userHome/etc/PetraServerConsole.config ] then bash -c "$cmd" || exit -1 @@ -219,10 +219,20 @@ sendRemindersAll() { } writeMySqlPwd() { - cat > $userHome/.my.cnf < $userHome/etc/my.cnf < $backupfile" + runAsUser "mysqldump --defaults-extra-file=$userHome/etc/my.cnf $OPENPETRA_DBNAME | gzip > $backupfile" echo `date` "Finished!" } @@ -271,18 +281,18 @@ mysqlrestore() { writeMySqlPwd echo "deleting database..." echo "SET FOREIGN_KEY_CHECKS = 0;" > $userHome/tmp/clean.sql - mysqldump --add-drop-table --no-data -u $OPENPETRA_DBUSER --defaults-extra-file=$userHome/.my.cnf --host=$OPENPETRA_DBHOST --port=$OPENPETRA_DBPORT $OPENPETRA_DBNAME | grep 'DROP TABLE' >> $userHome/tmp/clean.sql + mysqldump --defaults-extra-file=$userHome/etc/my.cnf --add-drop-table --no-data $OPENPETRA_DBNAME | grep 'DROP TABLE' >> $userHome/tmp/clean.sql echo "SET FOREIGN_KEY_CHECKS = 1;" >> $userHome/tmp/clean.sql - mysql -u $OPENPETRA_DBUSER --defaults-extra-file=$userHome/.my.cnf --host=$OPENPETRA_DBHOST --port=$OPENPETRA_DBPORT $OPENPETRA_DBNAME < $userHome/tmp/clean.sql + mysql --defaults-extra-file=$userHome/etc/my.cnf < $userHome/tmp/clean.sql rm $userHome/tmp/clean.sql echo "loading data..." echo $backupfile|grep -qE '\.gz$' if [ $? -eq 0 ] then - cat $backupfile | gunzip | mysql -u $OPENPETRA_DBUSER --defaults-extra-file=$userHome/.my.cnf --host=$OPENPETRA_DBHOST --port=$OPENPETRA_DBPORT $OPENPETRA_DBNAME > $userHome/log/mysqlload.log + cat $backupfile | gunzip | mysql --defaults-extra-file=$userHome/etc/my.cnf > $userHome/log/mysqlload.log else - mysql -u $OPENPETRA_DBUSER --defaults-extra-file=$userHome/.my.cnf --host=$OPENPETRA_DBHOST --port=$OPENPETRA_DBPORT $OPENPETRA_DBNAME < $backupfile > $userHome/log/mysqlload.log + mysql --defaults-extra-file=$userHome/etc/my.cnf < $backupfile > $userHome/log/mysqlload.log fi echo `date` "Finished!" @@ -612,7 +622,7 @@ mysqlinitdb() { fi echo "creating tables..." writeMySqlPwd - mysql -u $OPENPETRA_DBUSER --defaults-extra-file=$userHome/.my.cnf --host=$OPENPETRA_DBHOST --port=$OPENPETRA_DBPORT $OPENPETRA_DBNAME < $OpenPetraPath/db/createdb-MySQL.sql + mysql --defaults-extra-file=$userHome/etc/my.cnf < $OpenPetraPath/db/createdb-MySQL.sql echo "initial data..." # insert initial data so that loadymlgz will work @@ -622,7 +632,7 @@ insert into s_module(s_module_id_c) values ('SYSMAN'); insert into s_user_module_access_permission(s_user_id_c, s_module_id_c, s_can_access_l) values('SYSADMIN', 'SYSMAN', true); insert into s_system_status (s_user_id_c, s_system_login_status_l) values ('SYSADMIN', true); FINISH - mysql -u $OPENPETRA_DBUSER --defaults-extra-file=$userHome/.my.cnf --host=$OPENPETRA_DBHOST --port=$OPENPETRA_DBPORT $OPENPETRA_DBNAME < $OpenPetraPath/tmp/init-MySQL.sql + mysql --defaults-extra-file=$userHome/etc/my.cnf < $OpenPetraPath/tmp/init-MySQL.sql } # this will overwrite all existing data @@ -702,9 +712,9 @@ initdb() { if [[ ! $OPENPETRA_HTTP_URL == https://demo.* && ! $OPENPETRA_HTTP_URL == http://demo.* ]] then writeMySqlPwd - mysql -u $OPENPETRA_DBUSER --defaults-extra-file=$userHome/.my.cnf --host=$OPENPETRA_DBHOST --port=$OPENPETRA_DBPORT \ + mysql --defaults-extra-file=$userHome/etc/my.cnf \ -e "UPDATE s_user SET s_password_needs_change_l = 1 WHERE s_user_id_c = 'SYSADMIN'" $OPENPETRA_DBNAME - mysql -u $OPENPETRA_DBUSER --defaults-extra-file=$userHome/.my.cnf --host=$OPENPETRA_DBHOST --port=$OPENPETRA_DBPORT \ + mysql --defaults-extra-file=$userHome/etc/my.cnf \ -e "DELETE FROM s_user WHERE s_user_id_c <> 'SYSADMIN'" $OPENPETRA_DBNAME fi From 870fab7b366345fdb000cc78b62ca2b77d584c1f Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Fri, 8 Oct 2021 22:20:07 +0200 Subject: [PATCH 50/58] use node 14 for appveyor --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 22afecaf1f..4baa0faea1 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -2,7 +2,7 @@ image: Ubuntu2004 version: 1.0.{build} platform: x86 -stack: mysql, node 10 +stack: mysql, node 14 clone_depth: 1 init: [] environment: From ded2a17c83c93fced6aee0475bc40e362465f4b4 Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Sat, 9 Oct 2021 06:18:09 +0200 Subject: [PATCH 51/58] sponsorships: show all sponsors in the edit form. fixes #623 --- .../Petra/Server/lib/MSponsorship/web/webconnector.cs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/csharp/ICT/Petra/Server/lib/MSponsorship/web/webconnector.cs b/csharp/ICT/Petra/Server/lib/MSponsorship/web/webconnector.cs index 9923714572..8613847bdd 100644 --- a/csharp/ICT/Petra/Server/lib/MSponsorship/web/webconnector.cs +++ b/csharp/ICT/Petra/Server/lib/MSponsorship/web/webconnector.cs @@ -551,15 +551,15 @@ private static Int32 GetRecurringGiftBatchForSponsorship(Int32 ALedgerNumber, TD gdr.DonorPhoneNumber = DonorPhoneNumber; gdr.CurrencyCode = MainDS.ARecurringGiftBatch[0].CurrencyCode; } - } - } + MainDS.ARecurringGift.DefaultView.RowFilter = ""; + // drop all unrelated gift rows, that don't have a detail for this child for (int i = 0; i < MainDS.ARecurringGift.Count;) { - ARecurringGiftRow gr = MainDS.ARecurringGift[0]; + ARecurringGiftRow gr = MainDS.ARecurringGift[i]; MainDS.ARecurringGiftDetail.DefaultView.RowFilter = String.Format("{0} = {1}", ARecurringGiftDetailTable.GetGiftTransactionNumberDBName(), gr.GiftTransactionNumber); @@ -572,8 +572,9 @@ private static Int32 GetRecurringGiftBatchForSponsorship(Int32 ALedgerNumber, TD { i++; } - } + + MainDS.ARecurringGiftDetail.DefaultView.RowFilter = ""; } }); From 2163b76f2256796bfedcae94016a39329f574203 Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Sat, 9 Oct 2021 06:43:09 +0200 Subject: [PATCH 52/58] Export GL Transactions to Calc/Excel: format dates and decimals properly fixes #622 --- csharp/ICT/Common/IO/Csv2Xml.cs | 5 +++++ csharp/ICT/Petra/Server/lib/MFinance/GL/GL.Transactions.cs | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/csharp/ICT/Common/IO/Csv2Xml.cs b/csharp/ICT/Common/IO/Csv2Xml.cs index cb7fdfaa0c..4df65a1973 100644 --- a/csharp/ICT/Common/IO/Csv2Xml.cs +++ b/csharp/ICT/Common/IO/Csv2Xml.cs @@ -374,6 +374,10 @@ public static bool CSV2ExcelStream(string ACSVData, MemoryStream AStream, string Int32 rowCounter = 0; Int16 colCounter = 0; + ICellStyle wsstyle_dateformat = workbook.CreateCellStyle(); + ICreationHelper createHelper = workbook.GetCreationHelper(); + wsstyle_dateformat.DataFormat = createHelper.CreateDataFormat().GetFormat("dd/mm/yyyy"); + // we don't have headers for the columns List Lines = ACSVData.Split(Environment.NewLine).ToList(); @@ -401,6 +405,7 @@ public static bool CSV2ExcelStream(string ACSVData, MemoryStream AStream, string else if (v.TypeVariant == eVariantTypes.eDateTime) { wscell.SetCellValue(v.ToDate()); + wscell.CellStyle = wsstyle_dateformat; } else { diff --git a/csharp/ICT/Petra/Server/lib/MFinance/GL/GL.Transactions.cs b/csharp/ICT/Petra/Server/lib/MFinance/GL/GL.Transactions.cs index 92202bfc35..8604760468 100644 --- a/csharp/ICT/Petra/Server/lib/MFinance/GL/GL.Transactions.cs +++ b/csharp/ICT/Petra/Server/lib/MFinance/GL/GL.Transactions.cs @@ -5446,12 +5446,12 @@ public static bool ExportGLBatchTransactions(Int32 ALedgerNumber, Int32 ABatchNu requestParams.Add("TransactionsOnly", true); requestParams.Add("bDontSummarize", true); requestParams.Add("Summary", false); - requestParams.Add("DateFormatString", "dd.MM.yyyy"); + requestParams.Add("DateFormatString", "yyyy-MM-dd"); // use journal currency requestParams.Add("bUseBaseCurrency", false); requestParams.Add("BaseCurrency", "99"); requestParams.Add("DateForSummary", DateTime.Today); - requestParams.Add("NumberFormat", "European"); + requestParams.Add("NumberFormat", "American"); // need this for TVariant to recognise that as Decimal if (Exporting.ExportAllGLBatchData(batches, requestParams, out CSVExport)) { From 576d9a2c2ace4a17fa5e70bda758e52e92aa27a3 Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Tue, 12 Oct 2021 21:35:59 +0200 Subject: [PATCH 53/58] GLBatch: create new batch does not fail on empty debit or credit totals. fixes #616 --- .../Finance/GeneralLedger/GLBatchMaintenance/GLBatches.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/js-client/src/forms/Finance/GeneralLedger/GLBatchMaintenance/GLBatches.js b/js-client/src/forms/Finance/GeneralLedger/GLBatchMaintenance/GLBatches.js index 83abd3470b..1a92ed107b 100644 --- a/js-client/src/forms/Finance/GeneralLedger/GLBatchMaintenance/GLBatches.js +++ b/js-client/src/forms/Finance/GeneralLedger/GLBatchMaintenance/GLBatches.js @@ -310,6 +310,12 @@ function save_edit_batch(obj_modal) { exit; } payload['action'] = mode; + if (payload['ABatchDebitTotal'] == '') { + payload['ABatchDebitTotal'] = 0; + } + if (payload['ABatchCreditTotal'] == '') { + payload['ABatchCreditTotal'] = 0; + } api.post('serverMFinance.asmx/TGLTransactionWebConnector_MaintainBatches', payload).then(function (result) { parsed = JSON.parse(result.data.d); From dc8de079bc4177b63ef14f7322940fc765085024 Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Tue, 12 Oct 2021 21:49:55 +0200 Subject: [PATCH 54/58] update nuget MySqlConnector to 1.3.13 --- csharp/ThirdParty/packages.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csharp/ThirdParty/packages.config b/csharp/ThirdParty/packages.config index df6f8b1394..84685124e1 100644 --- a/csharp/ThirdParty/packages.config +++ b/csharp/ThirdParty/packages.config @@ -5,7 +5,7 @@ - + From 1ccdc324ddfbf4fa9e74888f32b250217a2f80ed Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Mon, 25 Oct 2021 19:19:48 +0200 Subject: [PATCH 55/58] upgrade nuget packages MySqlConnector, BouncyCastle and NPOI --- csharp/ThirdParty/packages.config | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/csharp/ThirdParty/packages.config b/csharp/ThirdParty/packages.config index 84685124e1..944a6e3cf8 100644 --- a/csharp/ThirdParty/packages.config +++ b/csharp/ThirdParty/packages.config @@ -5,7 +5,7 @@ - + @@ -19,13 +19,13 @@ - + - + From 9ee8bada4202d94ef1f3ad1ccd1854de7381ed7a Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Mon, 25 Oct 2021 22:00:38 +0200 Subject: [PATCH 56/58] add new link to source of PasswordUtilities library --- csharp/ThirdParty/PasswordUtilities/readme.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/csharp/ThirdParty/PasswordUtilities/readme.txt b/csharp/ThirdParty/PasswordUtilities/readme.txt index 3edf7f89e6..b6d6380620 100644 --- a/csharp/ThirdParty/PasswordUtilities/readme.txt +++ b/csharp/ThirdParty/PasswordUtilities/readme.txt @@ -1,4 +1,5 @@ -https://code.google.com/p/password-utilities +was: https://code.google.com/p/password-utilities +now: https://github.com/MarkStephenPearce/password-utilities A C# library that handles: @@ -16,4 +17,4 @@ Current version: Modified version based on version 1.3.1 PasswordPolicy.cs is modified to customise code for OpenPetra. -Various constants are changed and code is added to PasswordSatisfiesPolicy(string password). \ No newline at end of file +Various constants are changed and code is added to PasswordSatisfiesPolicy(string password). From ef1cdebeea674aa3994eb0ccf0ac23c12d440845 Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Tue, 26 Oct 2021 16:13:33 +0200 Subject: [PATCH 57/58] js-client: npm update and npm audit fix --- js-client/package-lock.json | 26 +++++++++++++------------- js-client/package.json | 4 ++-- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/js-client/package-lock.json b/js-client/package-lock.json index 05c8657a1b..09577c85ef 100644 --- a/js-client/package-lock.json +++ b/js-client/package-lock.json @@ -273,11 +273,11 @@ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" }, "axios": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", - "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", "requires": { - "follow-redirects": "^1.10.0" + "follow-redirects": "^1.14.0" } }, "balanced-match": { @@ -1264,9 +1264,9 @@ } }, "follow-redirects": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.2.tgz", - "integrity": "sha512-6mPTgLxYm3r6Bkkg0vNM0HTjfGrOEtsfbhagQvbxDEsEkpNhw582upBaoRZylzen6krEmxXJgt9Ju6HiI4O7BA==" + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", + "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==" }, "forever-agent": { "version": "0.6.1", @@ -2663,9 +2663,9 @@ }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "strip-ansi": { "version": "6.0.0", @@ -2823,9 +2823,9 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "uglify-js": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.1.tgz", - "integrity": "sha512-JhS3hmcVaXlp/xSo3PKY5R0JqKs5M3IV+exdLHW99qKvKivPO4Z8qbej6mte17SOPqAOVMjt/XGgWacnFSzM3g==" + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.2.tgz", + "integrity": "sha512-rtPMlmcO4agTUfz10CbgJ1k6UAoXM2gWb3GoMPPZB/+/Ackf8lNWk11K4rYi2D0apgoFRLtQOZhb+/iGNJq26A==" }, "umd": { "version": "3.0.3", diff --git a/js-client/package.json b/js-client/package.json index fbaf404672..3b7d4e53ab 100644 --- a/js-client/package.json +++ b/js-client/package.json @@ -5,7 +5,7 @@ "main": "index.js", "dependencies": { "@fortawesome/fontawesome-free": "^5.15.4", - "axios": "^0.21.1", + "axios": "^0.21.4", "bootstrap": "^4.6.0", "browserify": "^16.5.2", "browserify-css": "^0.15.0", @@ -15,7 +15,7 @@ "i18next-xhr-backend": "^1.5.1", "jquery": "^3.6.0", "popper.js": "^1.16.1", - "uglify-js": "^3.14.1" + "uglify-js": "^3.14.2" }, "devDependencies": {}, "scripts": { From 1668152fbec90fd7f475eba1dcbc286d32f6ffd9 Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Tue, 26 Oct 2021 21:21:04 +0200 Subject: [PATCH 58/58] prepare release 2021-10 add release notes for release 2021.10 increase db version number add empty database upgrade --- .../DBUpgrades/Upgrade202104_202110.cs | 44 +++++++++++++++++++ db/version.txt | 2 +- setup/releasenotes/releasenotes.html | 44 +++++++++++++++++++ setup/releasenotes/releasenotes_de.html | 43 ++++++++++++++++++ 4 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 csharp/ICT/Petra/Server/lib/MSysMan/DBUpgrades/Upgrade202104_202110.cs diff --git a/csharp/ICT/Petra/Server/lib/MSysMan/DBUpgrades/Upgrade202104_202110.cs b/csharp/ICT/Petra/Server/lib/MSysMan/DBUpgrades/Upgrade202104_202110.cs new file mode 100644 index 0000000000..c7d426c809 --- /dev/null +++ b/csharp/ICT/Petra/Server/lib/MSysMan/DBUpgrades/Upgrade202104_202110.cs @@ -0,0 +1,44 @@ +// +// DO NOT REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +// +// @Authors: +// timop +// +// Copyright 2004-2021 by OM International +// +// This file is part of OpenPetra.org. +// +// OpenPetra.org is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// OpenPetra.org is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with OpenPetra.org. If not, see . +// +using System; +using System.Data; +using Ict.Common.DB; +using Ict.Common; +using Ict.Common.Data; + +namespace Ict.Petra.Server.MSysMan.DBUpgrades +{ + /// + /// Upgrade the database + /// + public static partial class TDBUpgrade + { + /// Upgrade to version 2021-10 + public static bool UpgradeDatabase202104_202110(TDataBase ADataBase) + { + // there are no changes to the database structure + return true; + } + } +} diff --git a/db/version.txt b/db/version.txt index a4db0a68a2..562bd70ab4 100644 --- a/db/version.txt +++ b/db/version.txt @@ -1 +1 @@ -2021.04.0-0 +2021.10.0-0 diff --git a/setup/releasenotes/releasenotes.html b/setup/releasenotes/releasenotes.html index 1e282d23c4..a6257e5388 100644 --- a/setup/releasenotes/releasenotes.html +++ b/setup/releasenotes/releasenotes.html @@ -12,6 +12,50 @@

Monthly Releases of OpenPetra

+

Release 2021.10: October 26th, 2021

+ +

This release includes the work since May.
+A lot of work was done behind the scenes, to move the hosting of OpenPetra.com from virtual machines to shared hosting at https://hostsharing.net.
+Other changes happened in the setup of a ledger, for various scenarios.

+ +

So here is the list of changes for this release:

+ +Contact Module: +
    +
  • Search for Contacts with multiple parts of the name
  • +
+ +Accounting Module: +
    +
  • Creating new Ledger: International Currency should be set properly
  • +
  • add german account hierarchy example
  • +
  • Import of cost centre yml file: delete unused cost centres
  • +
  • GL Batch: adding new GL Batch with empty debit or credit will show server error
  • +
  • Debit and Credit should always be in this order
  • +
  • GL Batch: Import and Export of transactions
  • +
  • Exporting GL Batch to xlsx: decimal numbers exported as strings
  • +
+ +Donation Module: +
    +
  • display error message if donation batch cannot be opened because there are no motivation details
  • +
+ +Sponsored children: +
    +
  • Sponsorship: Edit form only shows only one sponsor even if there are multiple sponsors for this child
  • +
+ +Hosting OpenPetra: +
    +
  • empty instances have an error each morning in the log because of failing ExecuteScalar for SiteKey
  • +
  • Only run the hourly backup if the instance is actually being used
  • +
+ +

For more details about the issues solved in this release, visit the +Milestone at Github for release 2021.10!

+ +

Release 2021.04: April 30th, 2021

This release includes the work of two months, March and April. diff --git a/setup/releasenotes/releasenotes_de.html b/setup/releasenotes/releasenotes_de.html index 9ec2d5b7ef..4ba52462a6 100644 --- a/setup/releasenotes/releasenotes_de.html +++ b/setup/releasenotes/releasenotes_de.html @@ -12,6 +12,49 @@

Bemerkungen zu den monatlichen Veröffentlichungen von OpenPetra

+

Version 2021.10 vom 26. Oktober 2021

+ +

In dieser Version steckt die Arbeit seit Mai.
+Es wurde viel Zeit in Arbeit gesteckt, die nicht sichtbar ist: So wurde das Hosting von OpenPetra.com von virtuellen Maschinen auf das Shared Hosting bei https://hostsharing.net umgestellt.
+Weitere Änderungen wurden bei der Einrichtung des Finanzmoduls vorgenommen, um unterschiedliche Szenarien zu unterstützen.

+ +

Hier ist die Liste der Verbesserungen in dieser Version:

+ +Kontaktmodul: +
    +
  • Kontaktsuche funktioniert nun mit mehreren Teilen des Namens
  • +
+ +Finanzmodul: +
    +
  • Anlegen eines Hauptbuches: die internationale Währung soll richtig gesetzt werden (nicht nur EUR)
  • +
  • Importiere den SKR-49 Kontenrahmen von DATEV für Vereine und Stiftungen.
  • +
  • Import von Kostenstellen: Löscht nun ungenutzte Kostenstellen, die im Import fehlen.
  • +
  • Buchungstapel: Wenn man einen Stapel ohne Haben oder Soll anlegt, soll ein ordentlicher Hinweis als Fehlermeldung gezeigt werden.
  • +
  • Haben und Soll sollen immer in der richtigen Reihenfolge erscheinen.
  • +
  • Buchungsstapel: Buchungen importieren und exportieren
  • +
  • Export von Buchungsstapel nach xlsx: Dezimalzahlen wurden als Zeichenkette exportiert.
  • +
+ +Spendenmodul: +
    +
  • Zeige eine Fehlermeldung, falls ein Spendenstapel nicht geöffnet werden kann, weil es noch keine Verwendungszwecke gibt.
  • +
+ +Patenschaften: +
    +
  • Beim Bearbeiten der Patenschaft wurde nur ein Pate gezeigt, auch wenn mehrere Paten für das Kind eingetragen waren
  • +
+ +Hosting von OpenPetra: +
    +
  • Ungenutzte Instanzen haben jeden Morgen einen Fehler in die Logdatei geschrieben, weil es keinen SiteKey gab.
  • +
  • Das stündliche Backup soll nur für Instanzen angefertigt werden, die tatsächlich genutzt wurden.
  • +
+ +

Weitere Details über die gelösten Aufgaben dieser Version sind in dem +Meilenstein auf Github für die Version 2021.10 zu finden!

+

Version 2021.04 vom 30. April 2021

Diese Version beinhaltet die Arbeit von 2 Monaten, März und April.