diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 86accc6..16f9f96 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -13,6 +13,7 @@ - **Fuchs Intranet** is an ASP.NET Core (.NET 10) web application — the intranet IS the entire website, served from `/`. - Routes: `/{fn?}/{id?}/{code?}` → `IntranetController.Index`; `/do/{fn?}/{id?}/{code?}` → `IntranetController.Do`. - Build app: `dotnet build Fuchs/Fuchs.csproj -c Debug`. Build all: `dotnet build Fuchs_Intranet.slnx -c Debug`. +- Build the database project whenever anything under `Fuchs_Database/` changes: `msbuild Fuchs_Database/FuchsDatabase.sqlproj -p:Configuration=Debug` (MSBuild from the Visual Studio install, e.g. `"C:\Program Files\Microsoft Visual Studio\18\Community\MSBuild\Current\Bin\MSBuild.exe"`; `dotnet build` cannot build the legacy SSDT project). T-SQL warnings are build errors there (ADR 0036): an unresolved or ambiguous column (SQL71502) fails the build, and a red database build is a failure like a red C# build. The working-tree SQL is **not** on any database until it is published, so this build is the only check the SQL gets before review. - Frontend assets are source-built: run the gulp tasks in `Fuchs/` (`npx gulp min`, or `npx gulp all` when copied/static assets also need refreshing) whenever JS or SCSS/CSS sources change. The generated files under `Fuchs/wwwroot/web/` are what the app serves. - Test: `dotnet test --project Fuchs.Tests/Fuchs.Tests.csproj -c Debug` (the root `global.json` opts `dotnet test` into the Microsoft.Testing.Platform runner that xunit.v3 needs on the .NET 10 SDK; the positional-path form no longer works). - Always build **and** run the test suite before committing. CA1416 (platform-compatibility) is suppressed solution-wide via the root `.editorconfig` — the app is Windows-only. The build may still emit other pre-existing analyzer warnings; only treat `: error` lines as failures. @@ -61,6 +62,8 @@ ## Database - The SQL schema source of truth is the **`Fuchs_Database`** SSDT project. The backend is SQL-first (stored procedures, table types like `fds__tt__bankingtransactions`, functions via OCORE helpers — no EF Core). - When you change a stored proc name/params or a table type, update **both** the SSDT project and the calling C# in the same change. Verify every `[dbo].[…]` the backend calls actually exists in `Fuchs_Database`. +- Objects the SQL references must be **in the project** (a referenced-but-missing function only shows up as an SSDT build error now; the `ocms_*` helpers are vendored copies from the OCMSsharp `ocms_mt_database` project). `Security/Logins.sql` holds placeholder logins only so the users bind — real passwords live in Key Vault. +- `Fuchs.Tests/SqlContractTests` checks every `[dbo].[…]` named in C# against the SSDT files (exists, `EXECUTE` binds, function arg counts; ADR 0036) — a proc signature change that breaks a caller fails the test suite. ## Bank statement parsing (MT940 + CAMT) - Two parsers feed the same banking pipeline: the external `MT940Parser` (SWIFT text) and the in-repo **`CAMTParser`** project (ISO 20022 camt.052/053/054 XML). diff --git a/CLAUDE.md b/CLAUDE.md index 90ee2b3..1e5f79b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -15,6 +15,7 @@ ## Build & Test (workflow) - Build app: `dotnet build Fuchs/Fuchs.csproj -c Debug`. Build all: `dotnet build Fuchs_Intranet.slnx -c Debug`. +- Build the database project whenever anything under `Fuchs_Database/` changes: `msbuild Fuchs_Database/FuchsDatabase.sqlproj -p:Configuration=Debug` (MSBuild from the Visual Studio install, e.g. `"C:\Program Files\Microsoft Visual Studio\18\Community\MSBuild\Current\Bin\MSBuild.exe"`; `dotnet build` cannot build the legacy SSDT project). T-SQL warnings are build errors there (ADR 0036): an unresolved or ambiguous column (SQL71502) fails the build, and a red database build is a failure like a red C# build. The working-tree SQL is **not** on any database until it is published, so this build is the only check the SQL gets before review. - Frontend assets are source-built: run the gulp tasks in `Fuchs/` (`npx gulp min`, or `npx gulp all` when copied/static assets also need refreshing) whenever JS or SCSS/CSS sources change. The generated files under `Fuchs/wwwroot/web/` are what the app serves. - Test: `dotnet test --project Fuchs.Tests/Fuchs.Tests.csproj -c Debug` (the root `global.json` opts `dotnet test` into the Microsoft.Testing.Platform runner that xunit.v3 needs on the .NET 10 SDK; the positional-path form no longer works). - Always build **and** run the test suite before committing. CA1416 (platform-compatibility) is suppressed solution-wide via the root `.editorconfig` — the app is Windows-only. The build may still emit other pre-existing analyzer warnings; only treat `: error` lines as failures. @@ -49,6 +50,8 @@ ## Database - Schema source of truth: **`Fuchs_Database`** SSDT project. SQL-first backend (stored procs, table types e.g. `fds__tt__bankingtransactions`, functions via OCORE — no EF Core). - Changing a proc signature or table type → update the SSDT project **and** the calling C# together; verify every `[dbo].[…]` the backend calls exists in `Fuchs_Database`. +- Objects the SQL references must be **in the project** (a referenced-but-missing function only shows up as an SSDT build error now; the `ocms_*` helpers are vendored copies from the OCMSsharp `ocms_mt_database` project). `Security/Logins.sql` holds placeholder logins only so the users bind — real passwords live in Key Vault. +- `Fuchs.Tests/SqlContractTests` checks every `[dbo].[…]` named in C# against the SSDT files (exists, `EXECUTE` binds, function arg counts; ADR 0036) — a proc signature change that breaks a caller fails the test suite. ## Bank statement parsing (MT940 + CAMT) - `MT940Parser` (external, SWIFT text) and **`CAMTParser`** (in-repo, ISO 20022 camt.052/053/054 XML) feed the same pipeline. diff --git a/CODEX.md b/CODEX.md index cd1fd09..a4d56f9 100644 --- a/CODEX.md +++ b/CODEX.md @@ -15,6 +15,7 @@ ## Build & Test (workflow) - Build app: `dotnet build Fuchs/Fuchs.csproj -c Debug`. Build all: `dotnet build Fuchs_Intranet.slnx -c Debug`. +- Build the database project whenever anything under `Fuchs_Database/` changes: `msbuild Fuchs_Database/FuchsDatabase.sqlproj -p:Configuration=Debug` (MSBuild from the Visual Studio install, e.g. `"C:\Program Files\Microsoft Visual Studio\18\Community\MSBuild\Current\Bin\MSBuild.exe"`; `dotnet build` cannot build the legacy SSDT project). T-SQL warnings are build errors there (ADR 0036): an unresolved or ambiguous column (SQL71502) fails the build, and a red database build is a failure like a red C# build. The working-tree SQL is **not** on any database until it is published, so this build is the only check the SQL gets before review. - Frontend assets are source-built: run the gulp tasks in `Fuchs/` (`npx gulp min`, or `npx gulp all` when copied/static assets also need refreshing) whenever JS or SCSS/CSS sources change. The generated files under `Fuchs/wwwroot/web/` are what the app serves. - Test: `dotnet test --project Fuchs.Tests/Fuchs.Tests.csproj -c Debug` (the root `global.json` opts `dotnet test` into the Microsoft.Testing.Platform runner that xunit.v3 needs on the .NET 10 SDK; the positional-path form no longer works). - Always build **and** run the test suite before committing. CA1416 (platform-compatibility) is suppressed solution-wide via the root `.editorconfig` — the app is Windows-only. The build may still emit other pre-existing analyzer warnings; only treat `: error` lines as failures. @@ -49,6 +50,8 @@ ## Database - Schema source of truth: **`Fuchs_Database`** SSDT project. SQL-first backend (stored procs, table types e.g. `fds__tt__bankingtransactions`, functions via OCORE — no EF Core). - Changing a proc signature or table type -> update the SSDT project **and** the calling C# together; verify every `[dbo].[…]` the backend calls exists in `Fuchs_Database`. +- Objects the SQL references must be **in the project** (a referenced-but-missing function only shows up as an SSDT build error now; the `ocms_*` helpers are vendored copies from the OCMSsharp `ocms_mt_database` project). `Security/Logins.sql` holds placeholder logins only so the users bind — real passwords live in Key Vault. +- `Fuchs.Tests/SqlContractTests` checks every `[dbo].[…]` named in C# against the SSDT files (exists, `EXECUTE` binds, function arg counts; ADR 0036) — a proc signature change that breaks a caller fails the test suite. ## Bank statement parsing (MT940 + CAMT) - `MT940Parser` (external, SWIFT text) and **`CAMTParser`** (in-repo, ISO 20022 camt.052/053/054 XML) feed the same pipeline. diff --git a/Fuchs.Tests/AzureBlobStorageServiceTests.cs b/Fuchs.Tests/AzureBlobStorageServiceTests.cs index 82c3f35..81dabcd 100644 --- a/Fuchs.Tests/AzureBlobStorageServiceTests.cs +++ b/Fuchs.Tests/AzureBlobStorageServiceTests.cs @@ -173,6 +173,62 @@ public class AzureBlobStorageServiceTests Assert.True(delta >= 1, "fuchs.blobstorage.uploads.failed counter should have been incremented on a failed upload."); } + // ── Cancellation: a caller-cancelled token (app shutdown during the startup backfill) must + // surface as OperationCanceledException, not be logged/reported as a storage failure ──── + [Fact] + public async Task UploadInvoicePdfAsync_CallerCancelled_ThrowsOperationCanceled() + { + var (service, _, blob) = CreateMockedClientChain(); + using var cts = new CancellationTokenSource(); + cts.Cancel(); + blob.Setup(b => b.UploadAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .ThrowsAsync(new TaskCanceledException("The operation was canceled.")); + var svc = new AzureBlobStorageService(service.Object, CreateSettings(), NullLogger.Instance); + + await Assert.ThrowsAnyAsync( + () => svc.UploadInvoicePdfAsync("INV9", "Rechnung_INV9.pdf", new byte[] { 1 }, null, cts.Token)); + } + + [Fact] + public async Task UploadInvoicePdfAsync_TimeoutWithoutCallerCancel_ReturnsNull() + { + var (service, _, blob) = CreateMockedClientChain(); + blob.Setup(b => b.UploadAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .ThrowsAsync(new TaskCanceledException("network timeout")); + var svc = new AzureBlobStorageService(service.Object, CreateSettings(), NullLogger.Instance); + + Uri? result = await svc.UploadInvoicePdfAsync("INV9", "Rechnung_INV9.pdf", new byte[] { 1 }); + + Assert.Null(result); + } + + [Fact] + public async Task ExistsAsync_CallerCancelled_ThrowsOperationCanceled() + { + var (service, _, blob) = CreateMockedClientChain(); + using var cts = new CancellationTokenSource(); + cts.Cancel(); + blob.Setup(b => b.ExistsAsync(It.IsAny())) + .ThrowsAsync(new TaskCanceledException("The operation was canceled.")); + var svc = new AzureBlobStorageService(service.Object, CreateSettings(), NullLogger.Instance); + + await Assert.ThrowsAnyAsync( + () => svc.ExistsAsync("fuchs-invoices", "INV9", "Rechnung_INV9.pdf", cts.Token)); + } + + [Theory] + [InlineData(false)] // storage error + [InlineData(true)] // timeout-style cancellation while the caller's token is still live + public async Task ExistsAsync_CheckFailsWithoutCallerCancel_ReturnsFalse(bool timeout) + { + var (service, _, blob) = CreateMockedClientChain(); + Exception ex = timeout ? new TaskCanceledException("timeout") : new RequestFailedException("boom"); + blob.Setup(b => b.ExistsAsync(It.IsAny())).ThrowsAsync(ex); + var svc = new AzureBlobStorageService(service.Object, CreateSettings(), NullLogger.Instance); + + Assert.False(await svc.ExistsAsync("fuchs-invoices", "INV9", "Rechnung_INV9.pdf")); + } + // ── CopyInvoicePdfToBackupAsync ──────────────────────────────────────────── [Fact] diff --git a/Fuchs.Tests/DatevOverviewCommandTests.cs b/Fuchs.Tests/DatevOverviewCommandTests.cs new file mode 100644 index 0000000..86c8b0e --- /dev/null +++ b/Fuchs.Tests/DatevOverviewCommandTests.cs @@ -0,0 +1,99 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text.RegularExpressions; +using Fuchs.Controllers; +using Xunit; + +namespace Fuchs.Tests; + +/// +/// inv/datev (HandleDatev) called fds__getDatevExports @tgtdate, @mode, @authuser positionally +/// against the signature (@tgtdate, @mode, @files, @authuser): the user id landed in @files bit and +/// @authuser was never supplied, so every call failed (8114 / 201). The command now binds by name. +/// These tests check the command against the real SSDT procedure so a future signature change is caught. +/// +public class DatevOverviewCommandTests +{ + private const string ProcFile = "Stored Procedures/fds__getDatevExports.sql"; + + private static readonly Regex ParamDecl = new( + @"@(?\w+)\s+\w+(\s*\([^)]*\))?\s*(?=)?", + RegexOptions.Compiled); + + private static readonly Regex ExecArg = new( + @"(?@\w+)\s*(?=)?", + RegexOptions.Compiled); + + private static string? FindDatabaseProject() + { + for (var dir = new DirectoryInfo(AppContext.BaseDirectory); dir != null; dir = dir.Parent) + { + string candidate = Path.Combine(dir.FullName, "Fuchs_Database", "dbo"); + if (Directory.Exists(candidate)) return candidate; + } + return null; + } + + /// (name, hasDefault) of each parameter, in declaration order. + private static List<(string Name, bool HasDefault)> ProcParameters() + { + string? root = FindDatabaseProject(); + if (root == null) Assert.Skip("Fuchs_Database SSDT project not present in this checkout."); + string sql = File.ReadAllText(Path.Combine(root!, ProcFile)); + int start = sql.IndexOf("[fds__getDatevExports]", StringComparison.OrdinalIgnoreCase); + int end = Regex.Match(sql[start..], @"^\s*AS\s*$", RegexOptions.Multiline).Index + start; + return ParamDecl.Matches(sql[start..end]) + .Select(m => ("@" + m.Groups["name"].Value, m.Groups["def"].Success)) + .ToList(); + } + + /// + /// Binding problems of an EXECUTE text against the procedure: positional arguments, names the proc + /// does not declare, and required (no default) parameters that are not supplied. + /// + internal static List BindingProblems(string execSql, List<(string Name, bool HasDefault)> procParams) + { + string args = execSql[(execSql.IndexOf(']', execSql.IndexOf("fds__getDatevExports", StringComparison.Ordinal)) + 1)..]; + var problems = new List(); + var supplied = new HashSet(StringComparer.OrdinalIgnoreCase); + foreach (var part in args.TrimEnd(';', ' ').Split(',', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries)) + { + var m = ExecArg.Match(part); + if (!m.Success || !m.Groups["named"].Success) { problems.Add($"positional argument '{part}'"); continue; } + string name = m.Groups["name"].Value; + if (!procParams.Any(p => p.Name.Equals(name, StringComparison.OrdinalIgnoreCase))) + problems.Add($"unknown parameter {name}"); + supplied.Add(name); + } + problems.AddRange(procParams.Where(p => !p.HasDefault && !supplied.Contains(p.Name)) + .Select(p => $"required parameter {p.Name} not supplied")); + return problems; + } + + [Fact] + public void ProcParameters_RealSsdtFile_MatchesKnownSignature() + { + var ps = ProcParameters(); + Assert.Equal(new[] { "@tgtdate", "@mode", "@files", "@authuser" }, ps.Select(p => p.Name)); + Assert.Equal(new[] { false, true, false, false }, ps.Select(p => p.HasDefault)); + } + + [Fact] + public void DatevOverviewSql_AgainstRealProc_BindsEveryRequiredParameterByName() + => Assert.Empty(BindingProblems(IntranetController.DatevOverviewSql, ProcParameters())); + + [Theory] + [InlineData("EXECUTE [dbo].[fds__getDatevExports] @tgtdate, @mode, @authuser;")] // the former call + [InlineData("EXECUTE [dbo].[fds__getDatevExports] @tgtdate = @tgtdate, @mode = @mode, @files = 0;")] // @authuser missing + [InlineData("EXECUTE [dbo].[fds__getDatevExports] @tgtdate = @tgtdate, @files = 0, @user = @authuser;")] // unknown name + public void BindingProblems_MisboundCommand_IsReported(string execSql) + => Assert.NotEmpty(BindingProblems(execSql, ProcParameters())); + + [Fact] + public void DatevOverviewTables_NamesAllFourResultSetsInProcOrder() + // fds__getDatevExports returns header, invoice documents, bookings, debtors — the same four sets + // FdsMfr.GetDatevZip names admin/inv/buchungen/debitoren. Three names shifted every set by one. + => Assert.Equal(new[] { "admin", "files", "invoices", "debits" }, IntranetController.DatevOverviewTables); +} diff --git a/Fuchs.Tests/FdsColumnWidthsTests.cs b/Fuchs.Tests/FdsColumnWidthsTests.cs new file mode 100644 index 0000000..f496b90 --- /dev/null +++ b/Fuchs.Tests/FdsColumnWidthsTests.cs @@ -0,0 +1,304 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.IO; +using System.Linq; +using System.Text.RegularExpressions; +using fds; +using Xunit; + +namespace Fuchs.Tests; + +/// +/// mfr merge truncation (2026-09-30): mfr's free-text Note (ServiceObject up to 753 chars, +/// Company up to 723) overflowed NVARCHAR(255) in the mfr__ tables / mfr__tt__ types and every +/// batch holding such a row was rejected with the column-less message 8152. Covers the +/// failure-path diagnosis in and guards the widened SSDT schema. +/// +public class FdsColumnWidthsTests +{ + private const long LongNoteServiceObjectId = 38722404355; + + // Staged batch shaped like "SELECT TOP(0) [setid] = …, * FROM mfr__serviceobjects". + private static DataTable ServiceObjectBatch(params (long Id, string? Note)[] rows) + { + var t = new DataTable("mfr__serviceobjects"); + t.Columns.Add("setid", typeof(string)); + t.Columns.Add("Id", typeof(long)); + t.Columns.Add("Name", typeof(string)); + t.Columns.Add("Note", typeof(string)); + t.Columns.Add("CustomValues", typeof(string)); + t.Columns.Add("Version", typeof(int)); + foreach (var (id, note) in rows) + t.Rows.Add("abcde", id, "Heizung Keller", (object?)note ?? DBNull.Value, "[]", 1); + return t; + } + + private static Dictionary Widths(params (string Column, int Max)[] w) => + w.ToDictionary(x => x.Column, x => x.Max, StringComparer.OrdinalIgnoreCase); + + // ── IsTruncationError ──────────────────────────────────────────────────── + + [Theory] + [InlineData(8152, true)] // classic "String or binary data would be truncated." + [InlineData(2628, true)] // verbose variant (compat level 150+) that names the column + [InlineData(2627, false)] // PK violation + [InlineData(515, false)] // NULL into NOT NULL + [InlineData(8672, false)] // MERGE duplicate source row + [InlineData(0, false)] + [InlineData(-2, false)] // client timeout + public void IsTruncationError_ErrorNumber_OnlyTruncationNumbersMatch(int number, bool expected) + { + Assert.Equal(expected, FdsColumnWidths.IsTruncationError(number)); + } + + [Fact] + public void IsTruncationError_NonSqlOrNullException_ReturnsFalse() + { + Assert.False(FdsColumnWidths.IsTruncationError((Exception?)null)); + Assert.False(FdsColumnWidths.IsTruncationError(new InvalidOperationException("String or binary data would be truncated."))); + } + + // ── WidthsSql ──────────────────────────────────────────────────────────── + + [Fact] + public void WidthsSql_IsParameterised_AndCoversTargetTableAndItsTableType() + { + Assert.Contains("@tablename", FdsColumnWidths.WidthsSql); + Assert.Contains("REPLACE(@tablename, N'__', N'__tt__')", FdsColumnWidths.WidthsSql); // same naming as mfr__updt__ merge proc + Assert.Contains("sys.table_types", FdsColumnWidths.WidthsSql); + Assert.Contains("MIN(", FdsColumnWidths.WidthsSql); // narrower of table vs. type wins + } + + // ── ToWidthMap ─────────────────────────────────────────────────────────── + + private static DataTable WidthRows(params (object Name, object Max)[] rows) + { + var t = new DataTable(); + t.Columns.Add("columnname", typeof(object)); + t.Columns.Add("maxchars", typeof(object)); + foreach (var (n, m) in rows) t.Rows.Add(n, m); + return t; + } + + [Fact] + public void ToWidthMap_ValidRows_MapsCaseInsensitively() + { + var map = FdsColumnWidths.ToWidthMap(WidthRows(("Note", 255), ("setid", (short)5))); + + Assert.Equal(255, map["note"]); + Assert.Equal(5, map["SETID"]); + } + + [Fact] + public void ToWidthMap_SameColumnTwice_KeepsNarrower() + { + var map = FdsColumnWidths.ToWidthMap(WidthRows(("Note", 500), ("note", 255))); + + Assert.Equal(255, Assert.Single(map).Value); + } + + [Fact] + public void ToWidthMap_InvalidRows_AreSkipped() + { + var map = FdsColumnWidths.ToWidthMap(WidthRows( + ("", 10), (DBNull.Value, 10), ("A", DBNull.Value), ("B", 0), ("C", -1), ("Ok", 7))); + + Assert.Equal(new[] { "Ok" }, map.Keys); + } + + [Fact] + public void ToWidthMap_NullOrWrongShape_ReturnsEmpty() + { + Assert.Empty(FdsColumnWidths.ToWidthMap(null)); + var wrong = new DataTable(); + wrong.Columns.Add("name"); + wrong.Rows.Add("Note"); + Assert.Empty(FdsColumnWidths.ToWidthMap(wrong)); + } + + // ── FindOverflows ──────────────────────────────────────────────────────── + + [Theory] + [InlineData(0, false)] + [InlineData(254, false)] + [InlineData(255, false)] // exactly the limit fits + [InlineData(256, true)] // one over is rejected by SQL Server + [InlineData(753, true)] // the production ServiceObject note + public void FindOverflows_NoteLengthAroundLimit_ReportsOnlyWhenOver(int length, bool overflows) + { + var batch = ServiceObjectBatch((LongNoteServiceObjectId, new string('x', length))); + + var result = FdsColumnWidths.FindOverflows(batch, Widths(("Note", 255), ("Name", 255), ("setid", 5))); + + if (!overflows) { Assert.Empty(result); return; } + var o = Assert.Single(result); + Assert.Equal("Note", o.Column); + Assert.Equal(255, o.MaxAllowed); + Assert.Equal(length, o.LongestLength); + Assert.Equal(1, o.RowsOver); + Assert.Equal(LongNoteServiceObjectId, o.LongestRowId); + } + + [Fact] + public void FindOverflows_SeveralRowsOver_CountsThemAndPointsAtTheLongest() + { + var batch = ServiceObjectBatch((1, new string('a', 300)), (2, "short"), (3, new string('b', 539)), (4, null)); + + var o = Assert.Single(FdsColumnWidths.FindOverflows(batch, Widths(("Note", 255)))); + + Assert.Equal(2, o.RowsOver); + Assert.Equal(539, o.LongestLength); + Assert.Equal(3L, o.LongestRowId); + } + + [Fact] + public void FindOverflows_SeveralColumnsOver_ReportsEachColumn() + { + var batch = ServiceObjectBatch((7, new string('n', 300))); + batch.Rows[0]["setid"] = "toolong"; + + var cols = FdsColumnWidths.FindOverflows(batch, Widths(("Note", 255), ("setid", 5))).Select(o => o.Column); + + Assert.Equal(new[] { "setid", "Note" }, cols); // DataTable column order + } + + [Fact] + public void FindOverflows_MaxOrUnknownColumns_AreNeverReported() + { + // CustomValues is NVARCHAR(MAX) → WidthsSql omits it → no entry in the map. + var batch = ServiceObjectBatch((1, new string('x', 10_000))); + batch.Rows[0]["CustomValues"] = new string('c', 100_000); + + Assert.Empty(FdsColumnWidths.FindOverflows(batch, Widths(("Name", 255)))); + } + + [Fact] + public void FindOverflows_NonStringColumnWithWidth_IsIgnored() + { + var batch = ServiceObjectBatch((123456789012, "x")); + + Assert.Empty(FdsColumnWidths.FindOverflows(batch, Widths(("Id", 2), ("Version", 0)))); + } + + [Fact] + public void FindOverflows_EmptyBatchOrNoWidths_ReturnsEmpty() + { + Assert.Empty(FdsColumnWidths.FindOverflows(ServiceObjectBatch(), Widths(("Note", 1)))); + Assert.Empty(FdsColumnWidths.FindOverflows(ServiceObjectBatch((1, new string('x', 999))), Widths())); + } + + [Fact] + public void FindOverflows_TableWithoutIdColumn_ReportsWithoutRowId() + { + var t = new DataTable("mfr__*PartnerSet"); + t.Columns.Add("Property", typeof(string)); + t.Rows.Add(new string('p', 60)); + + var o = Assert.Single(FdsColumnWidths.FindOverflows(t, Widths(("property", 50)))); + + Assert.Null(o.LongestRowId); + Assert.Equal("Property: 60 > 50 chars (1 row)", o.ToString()); + } + + // ── Describe ───────────────────────────────────────────────────────────── + + [Fact] + public void Describe_NoOverflow_SaysNoneDetected() + { + Assert.Equal("none detected", FdsColumnWidths.Describe(Array.Empty())); + } + + [Fact] + public void Describe_Overflows_NameColumnLengthLimitAndId() + { + var text = FdsColumnWidths.Describe(new[] + { + new FdsColumnWidths.Overflow("Note", 255, 753, 1, LongNoteServiceObjectId), + new FdsColumnWidths.Overflow("Name", 255, 300, 3, 42L), + }); + + Assert.Equal("Note: 753 > 255 chars (1 row, e.g. Id=38722404355); Name: 300 > 255 chars (3 rows, e.g. Id=42)", text); + } + + // ── Real SSDT schema: the widened Note must stay unbounded end to end ──── + + private static readonly Regex ColumnDecl = new( + @"\[(?[^\]]+)\]\s+\[?n?varchar\]?\s*\(\s*(?\d+|max)\s*\)", + RegexOptions.IgnoreCase | RegexOptions.Compiled); + + private static string? FindDatabaseProject() + { + for (var dir = new DirectoryInfo(AppContext.BaseDirectory); dir != null; dir = dir.Parent) + { + string candidate = Path.Combine(dir.FullName, "Fuchs_Database", "dbo"); + if (Directory.Exists(candidate)) return candidate; + } + return null; + } + + /// Declared char widths of the bounded string columns in an SSDT object (MAX omitted, like WidthsSql). + private static Dictionary DeclaredWidths(string relativePath, string? onlyWithin = null) + { + string? root = FindDatabaseProject(); + if (root == null) Assert.Skip("Fuchs_Database SSDT project not present in this checkout."); + string sql = File.ReadAllText(Path.Combine(root!, relativePath)); + if (onlyWithin != null) + { + int start = sql.IndexOf(onlyWithin, StringComparison.OrdinalIgnoreCase); + Assert.True(start >= 0, $"'{onlyWithin}' not found in {relativePath}"); + sql = sql[start..sql.IndexOf(");", start, StringComparison.Ordinal)]; + } + var map = new Dictionary(StringComparer.OrdinalIgnoreCase); + foreach (Match m in ColumnDecl.Matches(sql)) + if (!m.Groups["len"].Value.Equals("max", StringComparison.OrdinalIgnoreCase)) + map[m.Groups["col"].Value] = int.Parse(m.Groups["len"].Value); + Assert.NotEmpty(map); // the regex still understands the file + return map; + } + + public static IEnumerable NoteCarriers() => new[] + { + new object[] { @"Tables\mfr__serviceobjects.sql", null! }, + new object[] { @"User Defined Types\mfr__tt__serviceobjects.sql", null! }, + new object[] { @"Tables\mfr__companies.sql", null! }, + new object[] { @"User Defined Types\mfr__tt__companies.sql", null! }, + // INSERT INTO @company SELECT cy.* FROM mfr__companies — must be as wide as the table. + new object[] { @"Stored Procedures\fds__getRequest_details.sql", "DECLARE @company TABLE" }, + new object[] { @"Stored Procedures\fds__prepStorno_recreate.sql", "DECLARE @company TABLE" }, + }; + + [Theory] + [MemberData(nameof(NoteCarriers))] + public void SsdtSchema_NoteColumn_IsUnbounded(string relativePath, string? onlyWithin) + { + var widths = DeclaredWidths(relativePath.Replace('\\', Path.DirectorySeparatorChar), onlyWithin); + + Assert.False(widths.ContainsKey("Note"), $"{relativePath}: [Note] is bounded ({(widths.TryGetValue("Note", out int w) ? w : 0)}) — mfr notes exceed 255 chars"); + } + + [Theory] + [InlineData(@"Tables\mfr__serviceobjects.sql", @"User Defined Types\mfr__tt__serviceobjects.sql")] + [InlineData(@"Tables\mfr__companies.sql", @"User Defined Types\mfr__tt__companies.sql")] + public void SsdtSchema_ProductionLongNote_FitsTableAndTableType(string table, string type) + { + var widths = DeclaredWidths(table.Replace('\\', Path.DirectorySeparatorChar)); + foreach (var kv in DeclaredWidths(type.Replace('\\', Path.DirectorySeparatorChar))) + widths[kv.Key] = widths.TryGetValue(kv.Key, out int w) ? Math.Min(w, kv.Value) : kv.Value; + var batch = ServiceObjectBatch((LongNoteServiceObjectId, new string('x', 753))); + + Assert.Empty(FdsColumnWidths.FindOverflows(batch, widths)); + } + + [Fact] + public void SsdtSchema_OldNarrowNote_WouldHaveBeenReported() + { + // Failing-path counterpart: with the pre-fix NVARCHAR(255) the same batch is diagnosed. + var widths = DeclaredWidths(Path.Combine("User Defined Types", "mfr__tt__serviceobjects.sql")); + widths["Note"] = 255; + var batch = ServiceObjectBatch((LongNoteServiceObjectId, new string('x', 753))); + + Assert.Equal("Note: 753 > 255 chars (1 row, e.g. Id=38722404355)", + FdsColumnWidths.Describe(FdsColumnWidths.FindOverflows(batch, widths))); + } +} diff --git a/Fuchs.Tests/InvoiceDatesTests.cs b/Fuchs.Tests/InvoiceDatesTests.cs new file mode 100644 index 0000000..0ea45d8 --- /dev/null +++ b/Fuchs.Tests/InvoiceDatesTests.cs @@ -0,0 +1,105 @@ +using System; +using System.Collections.Generic; +using Fuchs.intranet; +using Xunit; +using static OCORE.OCORE_dictionaries; + +namespace Fuchs.Tests; + +/// +/// ADR 0032: one invoice date for the PDF ("Rechnungsdatum") and the e-invoice issue date — +/// DateFinalized (incl. backdated), else DateCreated — converted from the stored UTC to the German +/// calendar day; plus the backdate request/response parsing used by inv/dpreview and req/sconf. +/// +public class InvoiceDatesTests +{ + private static GenericObjectDictionary Reg(object? finalized, object? created) => new(new Dictionary + { + ["DateFinalized"] = finalized, + ["DateCreated"] = created + }); + + [Fact] + public void IssueDate_FinalizedAndCreated_PrefersDateFinalized() + => Assert.Equal(new DateOnly(2026, 9, 30), + InvoiceDates.IssueDate(Reg(new DateTime(2026, 9, 30, 12, 0, 0), new DateTime(2026, 9, 2, 8, 0, 0)))); + + [Fact] + public void IssueDate_DraftWithoutFinalized_FallsBackToDateCreated() + => Assert.Equal(new DateOnly(2026, 9, 2), + InvoiceDates.IssueDate(Reg(DBNull.Value, new DateTime(2026, 9, 2, 8, 0, 0)))); + + [Fact] + public void IssueDate_NoRegistration_UsesProvidedUtcNow() + => Assert.Equal(new DateOnly(2026, 3, 1), + InvoiceDates.IssueDate(null, new DateTime(2026, 3, 1, 10, 0, 0, DateTimeKind.Utc))); + + [Theory] + // UTC late evening is already the next German day (summer +2h, winter +1h) + [InlineData("2026-09-30T22:30:00", "2026-10-01")] + [InlineData("2026-09-30T21:59:00", "2026-09-30")] + [InlineData("2026-01-31T23:30:00", "2026-02-01")] + [InlineData("2026-01-31T22:59:00", "2026-01-31")] + // backdated invoices are stored at 12:00 UTC and stay on their day + [InlineData("2026-08-31T12:00:00", "2026-08-31")] + [InlineData("2025-12-31T12:00:00", "2025-12-31")] + public void IssueDate_StoredUtc_ReturnsGermanCalendarDay(string storedUtc, string expected) + => Assert.Equal(DateOnly.Parse(expected), + InvoiceDates.IssueDate(Reg(DateTime.Parse(storedUtc), null))); + + [Theory] + [InlineData("2026-09-30", 2026, 9, 30)] + [InlineData(" 2025-12-31 ", 2025, 12, 31)] + public void ParseBackdate_IsoDate_ReturnsDate(string iso, int y, int m, int d) + => Assert.Equal(new DateOnly(y, m, d), InvoiceDates.ParseBackdate(iso)); + + [Theory] + [InlineData(null)] + [InlineData("")] + [InlineData("NULL")] + [InlineData("30.09.2026")] + [InlineData("2026-02-30")] + public void ParseBackdate_EmptyOrInvalid_ReturnsNull(string? iso) + => Assert.Null(InvoiceDates.ParseBackdate(iso)); + + [Theory] + [InlineData("1", true)] + [InlineData("true", true)] + [InlineData("TRUE", true)] + [InlineData("on", true)] + [InlineData("0", false)] + [InlineData("false", false)] + [InlineData("", false)] + [InlineData(null, false)] + [InlineData("yes please", false)] + public void IsBackdateRequested_FormValue_ParsesStrictly(string? value, bool expected) + => Assert.Equal(expected, InvoiceDates.IsBackdateRequested(value)); + + // fds__setInvoiceFinal result → what req/sconf tells the user. Only 60001 is a backdate rejection; + // a 0-row result is the already-final/sent guard (double submit) and must not invite a duplicate. + [Theory] + [InlineData("", null, 1, InvoiceFinalizeOutcome.Finalized)] + [InlineData(null, null, 1, InvoiceFinalizeOutcome.Finalized)] + [InlineData("SQL_exception: backdating not allowed", 60001, 0, InvoiceFinalizeOutcome.BackdateNotAllowed)] + [InlineData("SQL_exception: not authorized", 60000, 0, InvoiceFinalizeOutcome.Error)] + [InlineData("SQL_exception: lock not acquired", 60002, 0, InvoiceFinalizeOutcome.Error)] + [InlineData("SQL_exception: Cannot insert NULL", 515, 0, InvoiceFinalizeOutcome.Error)] + [InlineData("SQL_exception: timeout", null, 0, InvoiceFinalizeOutcome.Error)] + [InlineData("", null, 0, InvoiceFinalizeOutcome.AlreadyFinal)] + [InlineData(null, null, 0, InvoiceFinalizeOutcome.AlreadyFinal)] + public void ClassifyFinalizeResult_SqlOutcome_MapsToOutcome(string? exception, int? errorNumber, int rows, InvoiceFinalizeOutcome expected) + => Assert.Equal(expected, InvoiceDates.ClassifyFinalizeResult(exception, errorNumber, rows)); + + [Fact] + public void ClassifyFinalizeResult_ErrorNumber60001WithoutExceptionText_IsNotARejection() + // the number alone never arrives without a message; a row with no exception is a success + => Assert.Equal(InvoiceFinalizeOutcome.Finalized, InvoiceDates.ClassifyFinalizeResult("", 60001, 1)); + + [Theory] + [InlineData(InvoiceFinalizeOutcome.Finalized, "ok")] + [InlineData(InvoiceFinalizeOutcome.BackdateNotAllowed, "rejected")] + [InlineData(InvoiceFinalizeOutcome.AlreadyFinal, "already_final")] + [InlineData(InvoiceFinalizeOutcome.Error, "error")] + public void OutcomeTag_EveryOutcome_HasDistinctTelemetryTag(InvoiceFinalizeOutcome outcome, string expected) + => Assert.Equal(expected, InvoiceDates.OutcomeTag(outcome)); +} diff --git a/Fuchs.Tests/InvoiceItemReferenceTests.cs b/Fuchs.Tests/InvoiceItemReferenceTests.cs new file mode 100644 index 0000000..442e137 --- /dev/null +++ b/Fuchs.Tests/InvoiceItemReferenceTests.cs @@ -0,0 +1,32 @@ +using Fuchs.Services; +using Xunit; + +namespace Fuchs.Tests; + +/// +/// fds__invoice_items.reference_InvId links a CanceledInvoice / IntInvoiceAllocation line to the +/// invoice it cancels / credits. It was never persisted from the editor, so fds__setInvoiceFinal +/// could not record allocations (and a NULL reference aborted its MERGE). The posted ref is +/// normalised by . +/// +public class InvoiceItemReferenceTests +{ + [Theory] + [InlineData("XH6EH", "XH6EH")] + [InlineData(" 6BOY0 ", "6BOY0")] + [InlineData("12345678901234567890", "12345678901234567890")] // exactly varchar(20) + public void ItemReferenceInvId_ValidId_ReturnsTrimmedId(string raw, string expected) + => Assert.Equal(expected, InvoiceService.ItemReferenceInvId(raw)); + + [Theory] + [InlineData(null)] + [InlineData("")] + [InlineData(" ")] + [InlineData("null")] + [InlineData("NULL")] + [InlineData("123456789012345678901")] // longer than the column + [InlineData("AB'; DROP")] + [InlineData("R2025-0244")] // an invoice *number*, not an invoice id + public void ItemReferenceInvId_InvalidOrMissing_ReturnsNull(string? raw) + => Assert.Null(InvoiceService.ItemReferenceInvId(raw)); +} diff --git a/Fuchs.Tests/InvoicePgetIdTests.cs b/Fuchs.Tests/InvoicePgetIdTests.cs new file mode 100644 index 0000000..287ac02 --- /dev/null +++ b/Fuchs.Tests/InvoicePgetIdTests.cs @@ -0,0 +1,39 @@ +using Fuchs.Controllers; +using Xunit; + +namespace Fuchs.Tests; + +/// +/// inv/pget is the first call of both storno paths. Intranet-created invoices carry an +/// alphanumeric Id (fds__fn_invoice_id, e.g. "XH6EH"); rejecting those with 400 left the +/// storno window empty. Only mfr invoice ids (positive integers) may trigger the mfr reset. +/// +public class InvoicePgetIdTests +{ + [Theory] + [InlineData("12345", 12345L)] + [InlineData(" 987654321 ", 987654321L)] + [InlineData("9223372036854775807", long.MaxValue)] + public void TryGetMfrInvoiceId_NumericMfrId_ReturnsTrueWithValue(string raw, long expected) + { + Assert.True(IntranetController.TryGetMfrInvoiceId(raw, out long id)); + Assert.Equal(expected, id); + } + + [Theory] + [InlineData("XH6EH")] // Intranet invoice id + [InlineData("6BOY0")] // alphanumeric, starts with a digit + [InlineData("00000")] // numeric but not a valid (positive) mfr id + [InlineData("0")] + [InlineData("-5")] + [InlineData("1.5")] + [InlineData("1e3")] + [InlineData("9223372036854775808")] // overflow + [InlineData("")] + [InlineData(" ")] + [InlineData(null)] + public void TryGetMfrInvoiceId_NonMfrId_ReturnsFalse(string? raw) + { + Assert.False(IntranetController.TryGetMfrInvoiceId(raw, out _)); + } +} diff --git a/Fuchs.Tests/SqlContractTests.cs b/Fuchs.Tests/SqlContractTests.cs new file mode 100644 index 0000000..a5bb7a2 --- /dev/null +++ b/Fuchs.Tests/SqlContractTests.cs @@ -0,0 +1,298 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text.RegularExpressions; +using Xunit; + +namespace Fuchs.Tests; + +/// +/// The C# ↔ T-SQL contract, checked against the Fuchs_Database SSDT project (ADR 0036). +/// Every [dbo].[…] object named in a C# string must exist in the project, every +/// EXECUTE must bind against the procedure's declared parameters, and every scalar/table +/// function call must pass the declared number of arguments. None of this is visible to the +/// compiler or to a unit test that stubs the database — it used to fail only at runtime +/// (e.g. inv/datev passing three positional arguments to a four-parameter proc). +/// The SSDT build covers the SQL side of the same contract (unresolved/ambiguous columns). +/// +public class SqlContractTests +{ + internal sealed record SqlObject(string Name, string Kind, IReadOnlyList<(string Name, bool HasDefault)> Parameters); + + internal sealed record SqlReference(string File, int Line, string Name, bool IsExecute, bool IsCall, string Args); + + private const char JoinedBreak = '\u0001'; + + private static readonly string[] ScannedProjects = ["Fuchs", "Fuchs_DataService"]; + + // Signature FdsMfrClient.Update__entitytable uses for its dynamically named [mfr__updt__] call. + private static readonly string[] MfrUpdtSignature = ["@tblname", "@referencetable", "@tgtid"]; + + private static readonly Regex Declaration = new( + @"CREATE\s+(?:OR\s+ALTER\s+)?(?PROCEDURE|PROC|FUNCTION|TYPE|TABLE|VIEW)\s+(?:\[?dbo\]?\.)?\[?(?[^\]\s(]+)\]?", + RegexOptions.IgnoreCase | RegexOptions.Compiled); + + private static readonly Regex ParameterDeclaration = new( + @"@(?\w+)\s+(?:AS\s+)?[\w\[\]\.]+(?:\s*\([^)]*\))?(?:\s+READONLY)?\s*(?=)?", + RegexOptions.IgnoreCase | RegexOptions.Compiled); + + private static readonly Regex Reference = new( + @"(?EXEC(?:UTE)?\s+)?(?:@\w+\s*=\s*)?\[?dbo\]?\.\[?(?[A-Za-z][A-Za-z0-9_\-]*)\]?(?\s*\()?", + RegexOptions.IgnoreCase | RegexOptions.Compiled); + + // ── Locating and parsing ────────────────────────────────────────────────────────────────── + + private static string RepoRoot() + { + for (var dir = new DirectoryInfo(AppContext.BaseDirectory); dir != null; dir = dir.Parent) + if (Directory.Exists(Path.Combine(dir.FullName, "Fuchs_Database", "dbo")) + && Directory.Exists(Path.Combine(dir.FullName, "Fuchs"))) + return dir.FullName; + Assert.Skip("Fuchs_Database SSDT project not present in this checkout."); + return ""; + } + + internal static string StripSqlComments(string sql) => + Regex.Replace(Regex.Replace(sql, @"/\*.*?\*/", " ", RegexOptions.Singleline), @"--[^\n]*", " "); + + /// Parses one SSDT file into the object it declares, or null for non-object scripts. + internal static SqlObject? ParseObject(string sql) + { + sql = StripSqlComments(sql); + var m = Declaration.Match(sql); + if (!m.Success) return null; + string kind = m.Groups["kind"].Value.ToUpperInvariant() is "PROC" ? "PROCEDURE" : m.Groups["kind"].Value.ToUpperInvariant(); + string header = ""; + string rest = sql[(m.Index + m.Length)..]; + if (kind == "FUNCTION") + { + int open = rest.IndexOf('('), depth = 0; + for (int i = open; open >= 0 && i < rest.Length; i++) + { + depth += rest[i] == '(' ? 1 : rest[i] == ')' ? -1 : 0; + if (depth == 0) { header = rest[(open + 1)..i]; break; } + } + } + else if (kind == "PROCEDURE") + { + header = Regex.Split(rest, @"^\s*AS\b", RegexOptions.Multiline | RegexOptions.IgnoreCase)[0]; + header = Regex.Split(header, @"\bWITH\s+(?:EXECUTE|RECOMPILE|ENCRYPTION)", RegexOptions.IgnoreCase)[0]; + } + var ps = ParameterDeclaration.Matches(header) + .Select(p => ("@" + p.Groups["name"].Value.ToLowerInvariant(), p.Groups["def"].Success)) + .ToList(); + return new SqlObject(m.Groups["name"].Value, kind, ps); + } + + private static Dictionary LoadProject() + { + var objects = new Dictionary(StringComparer.OrdinalIgnoreCase); + foreach (var file in Directory.EnumerateFiles(Path.Combine(RepoRoot(), "Fuchs_Database", "dbo"), "*.sql", SearchOption.AllDirectories)) + if (ParseObject(File.ReadAllText(file)) is { } o) + objects[o.Name] = o; + return objects; + } + + /// + /// SQL object references in C# source. Comment lines are dropped (commented-out code and doc + /// comments name objects too) and adjacent concatenated literals are joined, so an + /// EXECUTE split over "…" + lines is seen as one statement. + /// + internal static IEnumerable ScanSource(string file, string source) + { + var lines = source.Split('\n'); + string code = string.Join('\n', lines.Select(l => l.TrimStart().StartsWith("//", StringComparison.Ordinal) ? "" : l)); + code = Regex.Replace(code, @"/\*.*?\*/", m => new string('\n', m.Value.Count(c => c == '\n')), RegexOptions.Singleline); + // Join "a " + "b". The swallowed line breaks become JoinedBreak: it counts as a line for the + // reported line number but does not end the statement's argument list. + code = Regex.Replace(code, "\"(\\s*\\+\\s*)\\$?@?\"", m => new string(JoinedBreak, m.Groups[1].Value.Count(c => c == '\n'))); + + foreach (Match m in Reference.Matches(code)) + { + string name = m.Groups["name"].Value; + if (name.StartsWith("sp_", StringComparison.OrdinalIgnoreCase) || name.StartsWith("sys", StringComparison.OrdinalIgnoreCase)) + continue; + int line = code.Take(m.Index).Count(c => c is '\n' or JoinedBreak) + 1; + string tail = code[(m.Index + m.Length)..]; + string args; + if (m.Groups["call"].Success) + { + int depth = 1, i = 0; + while (i < tail.Length && depth > 0) depth += tail[i++] switch { '(' => 1, ')' => -1, _ => 0 }; + args = tail[..Math.Max(0, i - 1)]; + } + else + { + int end = tail.IndexOfAny([';', '"', '\n']); + args = end < 0 ? tail : tail[..end]; + } + args = args.Replace(JoinedBreak.ToString(), "", StringComparison.Ordinal).Trim(); + yield return new SqlReference(file, line, name, m.Groups["exec"].Success, m.Groups["call"].Success, args); + } + } + + private static List ScanRepository() + { + string root = RepoRoot(); + return ScannedProjects + .SelectMany(p => Directory.EnumerateFiles(Path.Combine(root, p), "*.cs", SearchOption.AllDirectories)) + .Where(f => !Regex.IsMatch(f, @"[\\/](bin|obj)[\\/]")) + .SelectMany(f => ScanSource(Path.GetRelativePath(root, f), File.ReadAllText(f))) + .ToList(); + } + + // ── Binding rules ───────────────────────────────────────────────────────────────────────── + + /// Binding problems of an EXECUTE argument list against a procedure's parameters. + internal static List ExecuteProblems(string args, IReadOnlyList<(string Name, bool HasDefault)> ps) + { + var problems = new List(); + var supplied = new HashSet(StringComparer.OrdinalIgnoreCase); + bool sawNamed = false; + int position = 0; + foreach (var arg in args.Split(',', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries)) + { + var named = Regex.Match(arg, @"^(@\w+)\s*="); + if (named.Success) + { + sawNamed = true; + string n = named.Groups[1].Value.ToLowerInvariant(); + if (!ps.Any(p => p.Name == n)) problems.Add($"unknown parameter {n}"); + supplied.Add(n); + continue; + } + if (sawNamed) problems.Add($"positional argument '{arg}' after a named one"); + if (position >= ps.Count) { problems.Add($"argument '{arg}' beyond the {ps.Count} declared parameter(s)"); continue; } + supplied.Add(ps[position++].Name); + } + problems.AddRange(ps.Where(p => !p.HasDefault && !supplied.Contains(p.Name)) + .Select(p => $"required parameter {p.Name} not supplied")); + return problems; + } + + /// T-SQL functions take every declared argument (DEFAULT is passed explicitly). + internal static List CallProblems(string args, IReadOnlyList<(string Name, bool HasDefault)> ps) + { + int count = string.IsNullOrWhiteSpace(args) ? 0 : Regex.Split(args, @",(?![^(]*\))").Length; + return count == ps.Count ? [] : [$"{count} argument(s), function declares {ps.Count}"]; + } + + internal static List Problems(IEnumerable refs, IReadOnlyDictionary objects) + { + var problems = new List(); + foreach (var r in refs) + { + string at = $"{r.File}:{r.Line} [dbo].[{r.Name}]"; + if (!objects.TryGetValue(r.Name, out var o)) { problems.Add($"{at}: not in Fuchs_Database"); continue; } + var found = r.IsExecute && o.Kind == "PROCEDURE" ? ExecuteProblems(r.Args, o.Parameters) + : r.IsCall && o.Kind == "FUNCTION" ? CallProblems(r.Args, o.Parameters) + : []; + problems.AddRange(found.Select(p => $"{at}: {p}")); + } + return problems; + } + + // ── The contract, against the real repository ───────────────────────────────────────────── + + [Fact] + public void ScanRepository_RealSources_FindsTheKnownCallSites() + { + // Guards the scanner itself: a regex regression that matched nothing would pass every check below. + var refs = ScanRepository(); + Assert.True(refs.Count(r => r.IsExecute) >= 50, $"only {refs.Count(r => r.IsExecute)} EXECUTE call sites found"); + Assert.Contains(refs, r => r.IsExecute && r.Name.Equals("fds__getDatevExports", StringComparison.OrdinalIgnoreCase)); + Assert.Contains(refs, r => r.IsCall && r.Name.Equals("fis_getModuleAuth", StringComparison.OrdinalIgnoreCase)); + } + + [Fact] + public void CSharpSqlReferences_AgainstSsdtProject_ExistAndBind() + { + var problems = Problems(ScanRepository(), LoadProject()); + Assert.True(problems.Count == 0, "C# ↔ SQL contract violations:\n" + string.Join('\n', problems)); + } + + [Fact] + public void MfrUpdtProcedures_AllDeclareTheSignatureFdsMfrClientCallsDynamically() + { + var updt = LoadProject().Values.Where(o => o.Name.StartsWith("mfr__updt__", StringComparison.OrdinalIgnoreCase)).ToList(); + Assert.NotEmpty(updt); + Assert.All(updt, o => Assert.Equal(MfrUpdtSignature, o.Parameters.Select(p => p.Name))); + } + + [Fact] + public void LoggerSqlSinkProcedure_ExistsInSsdtProject() + // Program.cs configures the OCORE MultiLogger sink by name (ADR 0024); a missing proc silently loses every DB log row. + => Assert.True(LoadProject().TryGetValue("fds__admin_logdebug_ext", out var o) && o.Kind == "PROCEDURE"); + + // ── The rules themselves: succeeding and failing inputs ─────────────────────────────────── + + private static readonly (string, bool)[] Datev = [("@tgtdate", false), ("@mode", true), ("@files", false), ("@authuser", false)]; + + [Theory] + [InlineData("@tgtdate = @tgtdate, @files = 0, @authuser = @authuser")] + [InlineData("@tgtdate, @mode, @files, @authuser")] + [InlineData("@tgtdate, @mode, @files = 1, @authuser = @u")] + public void ExecuteProblems_CorrectlyBoundArguments_None(string args) + => Assert.Empty(ExecuteProblems(args, Datev)); + + [Theory] + [InlineData("@tgtdate, @mode, @authuser", "required parameter @authuser")] // the former inv/datev call + [InlineData("@tgtdate = @t, @files = 0, @user = @u", "unknown parameter @user")] + [InlineData("@tgtdate = @t, @mode, @files = 0, @authuser = @u", "after a named one")] + [InlineData("@a, @b, @c, @d, @e", "beyond the 4 declared")] + [InlineData("", "required parameter @tgtdate")] + public void ExecuteProblems_MisboundArguments_Reported(string args, string expected) + => Assert.Contains(ExecuteProblems(args, Datev), p => p.Contains(expected, StringComparison.Ordinal)); + + [Theory] + [InlineData("'fds_reports', @authuser", 2, true)] + [InlineData("LEFT(@a, 3), @b", 2, true)] + [InlineData("", 0, true)] + [InlineData("@authuser", 2, false)] + [InlineData("@a, @b, @c", 2, false)] + public void CallProblems_ArgumentCount_ReportedOnlyOnMismatch(string args, int declared, bool ok) + { + var ps = Enumerable.Range(0, declared).Select(i => ($"@p{i}", false)).ToList(); + Assert.Equal(ok, CallProblems(args, ps).Count == 0); + } + + [Fact] + public void ScanSource_ConcatenatedCommentedAndDocText_OnlyLiveStatementsWithFullArguments() + { + const string src = """ + var a = "EXECUTE [dbo].[proc_a] @x, " + + "@y;"; + // "EXECUTE [dbo].[proc_commented] @z;" + /// [dbo].[proc_doc] + var b = "SELECT [dbo].[fn_b](@p, LEFT(@q, 2)) AS v"; + """; + var refs = ScanSource("x.cs", src).ToList(); + Assert.Equal(["proc_a", "fn_b"], refs.Select(r => r.Name)); + Assert.Equal("@x, @y", refs[0].Args); + Assert.Equal(1, refs[0].Line); + Assert.Equal("@p, LEFT(@q, 2)", refs[1].Args); + Assert.Equal(5, refs[1].Line); + } + + [Fact] + public void Problems_ObjectMissingFromProject_Reported() + { + var objects = new Dictionary(StringComparer.OrdinalIgnoreCase); + var refs = new[] { new SqlReference("x.cs", 3, "fds__gone", true, false, "@a") }; + Assert.Equal(["x.cs:3 [dbo].[fds__gone]: not in Fuchs_Database"], Problems(refs, objects)); + } + + [Theory] + [InlineData("CREATE PROCEDURE [dbo].[p]\n\t@a as nvarchar(50)\n\t, @b int = 1 -- @c comment\nAS\nBEGIN SELECT 1 END", "PROCEDURE", "@a,@b", "False,True")] + [InlineData("create function [f](@count int = 10)\nRETURNS TABLE AS RETURN SELECT 1 as x", "FUNCTION", "@count", "True")] + [InlineData("CREATE FUNCTION [dbo].[g] (\n)\nRETURNS varchar(10) AS BEGIN RETURN '' END", "FUNCTION", "", "")] + [InlineData("CREATE TYPE [dbo].[tt] AS TABLE ([Id] int)", "TYPE", "", "")] + public void ParseObject_SsdtDeclarations_NameKindAndParameters(string sql, string kind, string names, string defaults) + { + var o = ParseObject(sql)!; + Assert.Equal(kind, o.Kind); + Assert.Equal(names, string.Join(",", o.Parameters.Select(p => p.Name))); + Assert.Equal(defaults, string.Join(",", o.Parameters.Select(p => p.HasDefault))); + } +} diff --git a/Fuchs/Controllers/IntranetController.InvoiceDraft.cs b/Fuchs/Controllers/IntranetController.InvoiceDraft.cs index a36ea6c..ec11835 100644 --- a/Fuchs/Controllers/IntranetController.InvoiceDraft.cs +++ b/Fuchs/Controllers/IntranetController.InvoiceDraft.cs @@ -3,6 +3,7 @@ using Fuchs.Services; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; using Newtonsoft.Json.Linq; +using static OCORE.SQL.sql; using static OCORE.web.mvc_helper_async; namespace Fuchs.Controllers; @@ -14,6 +15,20 @@ namespace Fuchs.Controllers; // only signals (ADR 0007). public partial class IntranetController { + /// + /// The date the calling user may backdate an invoice to (last working day of the previous month), or + /// null when not allowed — fds_inv > 2 and no invoice finalized after that date yet. The SQL function + /// is the single source; fds__setInvoiceFinal re-checks it when @backdate = 1 (ADR 0032). + /// + private async Task GetInvoiceBackdateAsync(string fn, string id, string code) + { + var val = await getSQLValue_async( + "SELECT CONVERT(varchar(10), [dbo].[fds__fn_invoiceBackdate](@authuser), 23);", + _intranet.Intranet__SQLConnectionString, "", + StdParamlist(), Security: DbSec, options: SqlOpt(fn, id, code)); + return InvoiceDates.ParseBackdate(val.Result); + } + /// Standard 410 when a session token is unknown/expired — the client re-opens the draft. private IActionResult DraftGone() => StatusCode(410, new { error = "expired" }); @@ -71,7 +86,8 @@ public partial class IntranetController return await JSONAsync(new { ok = true, version = session.Version }); } - // POST inv/dpreview — { token } → { img[], total } (rendered straight from the cache) + // POST inv/dpreview — { token } → { img[], total, backdate } (rendered straight from the cache). + // backdate ("yyyy-MM-dd" or null) drives the admin-only "Rechnungsdatum Vormonat" checkbox (ADR 0032). private async Task HandleDraftPreview(string fn, string id, string code) { if (!HasForm("token")) return BadRequest400(); @@ -81,7 +97,8 @@ public partial class IntranetController var doc = await _invoiceDrafts.RenderPreviewAsync(token); if (doc == null) return DraftGone(); var imgcol = await _pdf.DocToImageCollectionAsync(doc); - return await JSONAsync(new { img = imgcol.ImgB64Array, total = imgcol.TotalPages }); + DateOnly? backdate = await GetInvoiceBackdateAsync(fn, id, code); + return await JSONAsync(new { img = imgcol.ImgB64Array, total = imgcol.TotalPages, backdate = backdate?.ToString("yyyy-MM-dd") }); }); } diff --git a/Fuchs/Controllers/IntranetController.Invoices2.cs b/Fuchs/Controllers/IntranetController.Invoices2.cs index 1bb452b..940642e 100644 --- a/Fuchs/Controllers/IntranetController.Invoices2.cs +++ b/Fuchs/Controllers/IntranetController.Invoices2.cs @@ -16,10 +16,22 @@ namespace Fuchs.Controllers; // Partial class: Invoice sub-handlers public partial class IntranetController { + /// True when is an mfr invoice id (positive integer); Intranet-created + /// invoices use alphanumeric ids and have no mfr entity to reset. + internal static bool TryGetMfrInvoiceId(string? raw, out long mfrId) + => long.TryParse(raw?.Trim(), NumberStyles.None, CultureInfo.InvariantCulture, out mfrId) && mfrId > 0; + private async Task HandleInvoicePget(string fn, string id, string code) { if (!HasForm("id")) { _logger.LogWarning("HandleInvoicePget: missing 'id' form field user={User}", UserAccountID); return BadRequest400(); } - if (!long.TryParse(Form("id"), out long tgtid)) { _logger.LogWarning("HandleInvoicePget: invalid 'id' value='{Value}' user={User}", Form("id"), UserAccountID); return BadRequest400(); } + if (!TryGetMfrInvoiceId(Form("id"), out long tgtid)) + { + // Intranet-created invoices carry an alphanumeric Id (fds__fn_invoice_id) and have no mfr + // entity to reset. Both storno paths call pget first, so rejecting them here (400) left the + // storno window empty. Legacy parity: skip the mfr reset and report success. + _logger.LogDebug("HandleInvoicePget: non-mfr invoice id='{Value}', nothing to reset user={User}", Form("id"), UserAccountID); + return await JSONAsync(new { ok = true }); + } _logger.LogDebug("HandleInvoicePget tgtid={TgtId} user={User}", tgtid, UserAccountID); using (var mfr = _mfrFactory.Create()) @@ -263,6 +275,16 @@ public partial class IntranetController return await JSONAsync(new { payments = sqldt.Tables("items").toArrayofObjectDictionaries() }); } + /// + /// DATEV overview (inv/datev). Parameters are bound by name: the proc's signature is + /// (@tgtdate, @mode, @files, @authuser) and the former positional call put @authuser into + /// @files and never supplied @authuser, so every call failed. @files = 0 — the overview needs + /// no PDF bytes. Result sets in proc order: header, invoice documents, bookings, debtors. + /// + internal const string DatevOverviewSql = + "EXECUTE [dbo].[fds__getDatevExports] @tgtdate = @tgtdate, @mode = @mode, @files = 0, @authuser = @authuser;"; + internal static readonly string[] DatevOverviewTables = { "admin", "files", "invoices", "debits" }; + private async Task HandleDatev(string fn, string id, string code) { if (!DateTime.TryParseExact(Form("tgt"), "yy-MM-dd", @@ -274,10 +296,10 @@ public partial class IntranetController string mode = Form("mode").ne("m"); _logger.LogDebug("HandleDatev tgtdate={TgtDate} mode={Mode} user={User}", tgtdate.ToString("yy-MM-dd"), mode, UserAccountID); var dset = await getSQLDataSet_async( - "EXECUTE [dbo].[fds__getDatevExports] @tgtdate, @mode, @authuser;", + DatevOverviewSql, _intranet.Intranet__SQLConnectionString, StdParamlist(SQL_Date("@tgtdate", tgtdate), SQL_VarChar("@mode", mode)), - tablenames: new[] { "files", "invoices", "debits" }, + tablenames: DatevOverviewTables, Security: DbSec, options: SqlOpt(fn, id, code)); _logger.LogDebug("HandleDatev tgtdate={TgtDate} files={FileCount} invoices={InvCount} user={User}", tgtdate.ToString("yy-MM-dd"), dset.Tables("files").Rows.Count, dset.Tables("invoices").Rows.Count, UserAccountID); @@ -465,7 +487,10 @@ public partial class IntranetController ["NameOrNumber"] = "", ["htmltext"] = d["Text"], ["position"] = d["Position"], - ["SortOrder"] = d["SortOrder"] + ["SortOrder"] = d["SortOrder"], + // Round-trips the referenced invoice (CanceledInvoice / IntInvoiceAllocation) so a + // re-saved draft keeps it — fds__setInvoiceFinal needs it for Replaces/allocations. + ["reference_InvId"] = d.nz("reference_InvId") is { Length: > 0 } refId ? refId : null }); } sdic["items"] = itm; diff --git a/Fuchs/Controllers/IntranetController.Requests.cs b/Fuchs/Controllers/IntranetController.Requests.cs index d7a9e60..047a10b 100644 --- a/Fuchs/Controllers/IntranetController.Requests.cs +++ b/Fuchs/Controllers/IntranetController.Requests.cs @@ -1,5 +1,6 @@ using System.Globalization; using Fuchs.intranet; +using Fuchs.Observability; using Fuchs.Services; using Microsoft.AspNetCore.Mvc; using Microsoft.Data.SqlClient; @@ -302,14 +303,41 @@ public partial class IntranetController private async Task HandleRequestSconf(string fn, string id, string code) { if (!HasForm("id")) { _logger.LogWarning("HandleRequestSconf: missing form field 'id', user={User}", UserAccountID); return BadRequest400(); } - _logger.LogInformation("HandleRequestSconf: finalizing invoice {InvId} user={User}", Form("id"), UserAccountID); + // Admin option: date the invoice to the last working day of the previous month (ADR 0032). + // fds__setInvoiceFinal re-validates (fds_inv > 2, no later invoice) and throws otherwise. + bool backdate = InvoiceDates.IsBackdateRequested(Form("backdate")); + _logger.LogInformation("HandleRequestSconf: finalizing invoice {InvId} backdate={Backdate} user={User}", Form("id"), backdate, UserAccountID); var dt = await getSQLDatatable_async( - "EXECUTE [dbo].[fds__setInvoiceFinal] @Id, @authuser;", + "EXECUTE [dbo].[fds__setInvoiceFinal] @Id, @authuser, @backdate;", _intranet.Intranet__SQLConnectionString, - StdParamlist(SQL_VarChar("@Id", Form("id"))), + StdParamlist(SQL_VarChar("@Id", Form("id")), SQL_Bit("@backdate", backdate)), Security: DbSec, options: SqlOpt(fn, id, code)); if (!string.IsNullOrEmpty(dt.Exception)) - _logger.LogError("HandleRequestSconf: SQL error finalizing invoice {InvId}: {SqlError}, user={User}", Form("id"), dt.Exception, UserAccountID); + _logger.LogError("HandleRequestSconf: SQL error {SqlErrorNumber} finalizing invoice {InvId}: {SqlError}, user={User}", dt.ExceptionCode, Form("id"), dt.Exception, UserAccountID); + // Only SQL error 60001 is a backdate rejection. A 0-row result means the invoice is already + // final/sent (double submit) — it must not be reported as "create it again without backdating". + var outcome = InvoiceDates.ClassifyFinalizeResult(dt.Exception, dt.ExceptionCode, dt.Count); + if (backdate) + { + FuchsTelemetry.InvoicesBackdated.Add(1, new KeyValuePair("outcome", InvoiceDates.OutcomeTag(outcome))); + if (outcome == InvoiceFinalizeOutcome.Finalized) + _logger.LogInformation(new EventId(0, "InvoiceBackdated"), + "Invoice {InvId} finalized with backdated invoice date {DateFinalized} user={User}", + Form("id"), dt.FirstRow.toObjectDictionary().nz("DateFinalized"), UserAccountID); + } + switch (outcome) + { + case InvoiceFinalizeOutcome.BackdateNotAllowed: + return await InvoiceIssueResult( + "Die Rechnung wurde nicht erstellt: Das Rechnungsdatum kann nicht mehr auf den Vormonat gesetzt werden (es wurde bereits eine Rechnung im neuen Monat erstellt). Bitte ohne Rückdatierung erneut erstellen.", + Form("id")); + case InvoiceFinalizeOutcome.AlreadyFinal: + return await InvoiceIssueResult( + "Die Rechnung ist bereits abgeschlossen oder versendet und wurde nicht erneut erstellt.", + Form("id")); + case InvoiceFinalizeOutcome.Error: + return await InvoiceIssueResult("Die Rechnung konnte aufgrund eines Fehlers nicht erstellt werden.", Form("id")); + } var frdic = dt.FirstRow.toObjectDictionary(); if (frdic.TryGetValue("IsFinal", out var isFinal) && isFinal is true) { diff --git a/Fuchs/Docs/ARCHITECTURE.md b/Fuchs/Docs/ARCHITECTURE.md index f4c8b0c..4e1e803 100644 --- a/Fuchs/Docs/ARCHITECTURE.md +++ b/Fuchs/Docs/ARCHITECTURE.md @@ -446,3 +446,4 @@ public class MfrClientFactory : IMfrClientFactory, IDisposable - The SQL schema lives in the **`Fuchs_Database`** SSDT project (source of truth). The backend is SQL-first: it calls stored procedures, table-valued types (e.g. `fds__tt__bankingtransactions`) and functions via OCORE ADO.NET helpers. - When changing a stored procedure's name/parameters or a table type, update both the SSDT project and the calling C# in the same change, and keep the MT940/CAMT banking column mappings aligned with `fds__tt__bankingtransactions`. +- The SSDT project is the compile step for all T-SQL: it references the `master` system dacpac and treats T-SQL warnings as errors (`TreatTSqlWarningsAsErrors`, ADR 0036), so an unresolved or ambiguous reference fails `msbuild Fuchs_Database/FuchsDatabase.sqlproj` instead of surfacing at runtime. diff --git a/Fuchs/Docs/Decisions/0032-invoice-backdating-to-previous-month.md b/Fuchs/Docs/Decisions/0032-invoice-backdating-to-previous-month.md new file mode 100644 index 0000000..a073fdb --- /dev/null +++ b/Fuchs/Docs/Decisions/0032-invoice-backdating-to-previous-month.md @@ -0,0 +1,68 @@ +--- +status: Accepted +date: 2026-09-30 +applyTo: + - "Fuchs_Database/dbo/Functions/fds__fn_invoiceBackdate.sql" + - "Fuchs_Database/dbo/Stored Procedures/fds__setInvoiceFinal.sql" + - "Fuchs/code/InvoiceDates.cs" + - "Fuchs/Services/ERechnungMapper.cs" + - "Fuchs/Services/InvoiceService.cs" + - "Fuchs/Controllers/IntranetController.InvoiceDraft.cs" + - "Fuchs/Controllers/IntranetController.Requests.cs" + - "Fuchs/js/intranet/modules/fis.inv_shared.js" +supersededBy: "" +--- + +# 0032 — Invoices may be backdated to the last working day of the previous month (admins only) + +## Context + +Work done at the end of a month is often invoiced in the first days of the next month. The customer +wants those invoices dated to the previous month. The invoice date was always the moment of +finalisation (`fds__setInvoiceFinal`: `DateFinalized = GETUTCDATE()`), and the invoice number is +drawn from the year of that date (`fds__newInvoiceId(Year(...))`). + +Two invoice dates also existed side by side: the PDF printed `DateCreated` (draft creation) as +"Rechnungsdatum", while the embedded ZUGFeRD/XRechnung issue date (BT-2) used `DateFinalized` — a +visible date and an e-invoice date that could disagree. + +## Decision + +- **One invoice date.** PDF "Rechnungsdatum" and e-invoice issue date both come from + `InvoiceDates.IssueDate`: `DateFinalized` (converted from the stored UTC to the German calendar + day), falling back to `DateCreated` for drafts. +- **Backdating option.** When finalising, a user with `fds_inv > 2` may date the invoice to the + **last working day (Mon–Fri) of the previous month** — a fixed date, not a free choice. Public + holidays are not excluded (possible later extension). +- **Only while no invoice exists after that date.** Invoice numbers must ascend with invoice dates, + so the option is offered and accepted only while no invoice has been finalized after the backdate + day (a 2 h margin covers the UTC storage). +- **Single source of truth:** `[dbo].[fds__fn_invoiceBackdate](@authuser)` returns the allowed date or + NULL (authorisation + eligibility). `inv/dpreview` returns it so the preview dialog shows the + per-invoice checkbox; `req/sconf` passes `@backdate = 1`, and `fds__setInvoiceFinal` re-evaluates + the function and `THROW`s (60001) when it is no longer allowed — nothing is finalised then. +- **Serialized finalisation.** `fds__setInvoiceFinal` runs check + numbering `UPDATE` in one + transaction under an exclusive, transaction-owned app lock (`sp_getapplock`, resource + `fds__setInvoiceFinal`) taken by every finalisation, so a concurrent normal finalisation cannot + slip between the eligibility check and the backdated write and break the date/number order. +- `req/sconf` maps only SQL error 60001 to the "no longer possible, create without backdating" + message. A 0-row result (invoice already final/sent, e.g. a double submit) is reported as + "already finalised" — never as a backdate rejection, which would invite a duplicate invoice. +- A backdated invoice is stored with `DateFinalized = 12:00` (UTC, stays on the same German + day), its number comes from that day's year, and `DueDate` is recomputed from the payment term + anchored on that day. +## Consequences + +- The PDF of every newly finalised invoice now shows the finalisation date instead of the draft + creation date (intended: it now matches the e-invoice and the number sequence). +- In January the option yields a December date and therefore a number from the previous year's range. +- Lists, reports, DATEV and reminders follow the same invoice date — see ADR 0035. +- Telemetry: `fuchs.invoices.backdated` (outcome ok / rejected / already_final / error); successful + backdating logs EventId `InvoiceBackdated`. + +## Alternatives considered + +- **Free date picker for admins** — rejected: breaks the date/number order too easily; the need is + exactly "previous month's last working day". +- **Global admin switch "backdate everything until the first invoice of the month"** — rejected by + the customer in favour of an explicit per-invoice checkbox. diff --git a/Fuchs/Docs/Decisions/0033-mfr-free-text-columns-unbounded.md b/Fuchs/Docs/Decisions/0033-mfr-free-text-columns-unbounded.md new file mode 100644 index 0000000..29b1d63 --- /dev/null +++ b/Fuchs/Docs/Decisions/0033-mfr-free-text-columns-unbounded.md @@ -0,0 +1,52 @@ +--- +status: Accepted +date: 2026-09-30 +applyTo: + - "Fuchs_Database/dbo/Tables/mfr__*.sql" + - "Fuchs_Database/dbo/User Defined Types/mfr__tt__*.sql" + - "Fuchs_Database/dbo/Stored Procedures/mfr__updt__*.sql" + - "Fuchs_DataService/FdsMfrClient.cs" + - "Fuchs_DataService/FdsColumnWidths.cs" +supersededBy: "" +--- + +# 0033 — mfr free-text columns are NVARCHAR(MAX); table, table type and copies stay aligned + +## Context +mfr publishes no length limits for its string properties (`MFR_RESTClient/Docs/mfr_interface_description.md`). +`[mfr__serviceobjects].[Note]` and `[mfr__companies].[Note]` were `NVARCHAR(255)`, as were their +merge types `mfr__tt__serviceobjects` / `mfr__tt__companies`. From 2026-09-25, users typed longer +notes in mfr (ServiceObject up to 753 chars, Company up to 723). The `mfr__updt__*` merge proc copies +the staging table into the table type, so SQL Server rejected every batch holding such a row +(msg 8152, which names no column). That included every Company/Contact/ServiceRequest sync that +`$expand`s the row. The result was about 1000 errors in five days, plus rows the short sync never +re-fetched, because it only reads rows newer than the local `DateModified` watermark. Merge failures +were silent until 8bcec40 began logging them, so earlier occurrences went unnoticed. + +## Decision +- Free-text mfr properties (`Note`, `Description`, `Comment`, …) are stored as `NVARCHAR(MAX)`. + Bounded widths are kept only for values mfr structurally keeps short (ids, codes, names), and + those are revisited when data proves otherwise. +- A width change is made in the target table, its `mfr__tt__*` type **and** every table variable + or type that copies the row with `SELECT *` (e.g. `@company` in `fds__getRequest_details`, + `fds__prepInvoice`, `fds__prepStorno_recreate`), all in the same change. Otherwise the truncation + just moves to the next copy. +- Truncating at the mapping layer was rejected. The data service does **not** truncate + silently. Instead, when a merge fails with 8152/2628, `FdsColumnWidths` compares the staged + batch against the narrower of the table and type widths. The error log then names column, longest + length, limit and an entity Id (`over-long columns: Note: 753 > 255 chars (1 row, e.g. Id=…)`). + This lookup runs only on the failure path. + +## Consequences +- Changing a `mfr__tt__*` type means DROP + CREATE (types cannot be ALTERed). The procs that + DECLARE the type must be dropped first and recreated. See + `Fuchs_Database/Scripts/2026-09-30_mfr_truncation_fix.sql` for the pattern, including grants. +- After fixing a rejected merge, queue the affected Ids in `fds__mfr_updaterequests`. The short + sync will not revisit them, and the nightly full reset is disabled in `fds__getUpdateableTables`. +- `NVARCHAR(MAX)` columns cannot be index key columns. None of the widened columns is indexed. + +## Alternatives considered +- **Truncate to the column width in `SetRowValue`**: this would keep syncing, but it loses user text + silently. For keys such as `ExternalId` (DATEV customer number) it would corrupt data. Rejected. +- **Widen to a larger fixed size (e.g. 1000, like `mfr__contacts.Note`)**: this just moves the + cliff. mfr enforces no limit. Rejected for free text. diff --git a/Fuchs/Docs/Decisions/0034-abschlagsrechnung-credit-follows-the-live-invoice.md b/Fuchs/Docs/Decisions/0034-abschlagsrechnung-credit-follows-the-live-invoice.md new file mode 100644 index 0000000..8dc9475 --- /dev/null +++ b/Fuchs/Docs/Decisions/0034-abschlagsrechnung-credit-follows-the-live-invoice.md @@ -0,0 +1,64 @@ +--- +status: Accepted +date: 2026-09-30 +applyTo: + - "Fuchs_Database/dbo/Functions/fds__fn_IntermediateIsAllocatedToOther.sql" + - "Fuchs_Database/dbo/Stored Procedures/fds__setInvoiceFinal.sql" + - "Fuchs_Database/dbo/Stored Procedures/fds__prepInvoice.sql" + - "Fuchs_Database/dbo/Stored Procedures/fds__prepStorno_recreate.sql" + - "Fuchs_Database/dbo/Stored Procedures/fds__createStorno_*.sql" + - "Fuchs_Database/Scripts/2026-09-30_backfill_intermediate_invoice_allocations.sql" +supersededBy: "" +--- + +# 0034 — An Abschlagsrechnung credit follows the live invoice + +## Context + +A Schlussrechnung credits the Abschlagsrechnungen (intermediate invoices, `InvoiceType = 'i'`) +already paid for the same service requests via `IntInvoiceAllocation` lines. Finalising it records +the claim in `fds__invoice_details.AllocatedTo_InvId` of each credited intermediate so that +`fds__prepInvoice` does not offer the same Abschlagsrechnung again. + +Until 2026-09-30 that claim was never actually written (the editor dropped `reference_InvId`, the +MERGE aborted on the NULL). The moment it is written, the question "what happens to the claim when +the crediting invoice is cancelled?" becomes real: a Storno (simple/copy) or a Storno + recreate +leaves `AllocatedTo_InvId` pointing at the cancelled invoice, and the next invoice for the same +service requests would silently bill the customer again for money already paid. + +## Decision + +- **A claim counts only while the crediting invoice is alive.** An `AllocatedTo_InvId` that points + at a cancelled invoice (`IsCanceled = 1`), at a non-existent invoice, or at the invoice that the + one being finalised replaces (`CanceledInvoice` line → `@Replaces`) is void: the Abschlagsrechnung + is offered again by `fds__prepInvoice` / `fds__prepStorno_recreate` and may be taken over by the + next finalisation. The single source of truth for "already credited elsewhere" is + `[dbo].[fds__fn_IntermediateIsAllocatedToOther]`; `fds__setInvoiceFinal`'s `existing` CTE is its + set-based twin and must apply the same rule. +- **The link is not cleared on cancellation.** Cancellation has several paths (storno simple/copy, + storno + recreate, the retired `fds__setInvoiceCancelled`); rather than releasing the link in each, + the readers ignore dead links. The last claimant therefore stays visible for auditing. +- **A Stornorechnung (`InvoiceType = 'c'`) never claims.** `fds__createStorno_copy` mirrors the + cancelled invoice's `IntInvoiceAllocation` lines (with their references) so the storno document + shows them, but finalising the storno must not move the allocation onto it. +- **Storno + recreate carries the references.** `fds__prepStorno_recreate` emits its credit lines + with the same type as `fds__prepInvoice` (`IntInvoiceAllocation`, not `PartialInvoice`) and the + credited invoice in `reference_InvId`, and its `CanceledInvoice` line references the replaced + invoice — otherwise the replacement neither takes over the credit nor records what it replaces. + +## Consequences + +- The recreate flow now produces `Replaces_InvId` / `DateCancelled` on the replaced invoice via the + regular `fds__setInvoiceFinal` bookkeeping (it did not before: no reference reached the proc). +- A second recreate (cancel the replacement, recreate again) keeps the credit because the claim on + the replaced invoice is treated as void during the replacement's finalisation. +- The one-off backfill script records the *earliest* live claimant; it is consistent with this rule. +- An intermediate that is itself cancelled is not offered (unchanged). + +## Alternatives considered + +- **Release `AllocatedTo_InvId` when the crediting invoice is cancelled** — rejected: four write + paths to keep in sync, and the audit trail of who last credited the Abschlagsrechnung is lost. +- **Keep `PartialInvoice` for recreated credit lines and teach `fds__setInvoiceFinal` both types** — + rejected: one line type per meaning; `PartialInvoice` remains the Abschlagsbetrag charge line of an + intermediate invoice. diff --git a/Fuchs/Docs/Decisions/0035-invoice-date-is-datefinalized-everywhere.md b/Fuchs/Docs/Decisions/0035-invoice-date-is-datefinalized-everywhere.md new file mode 100644 index 0000000..f553533 --- /dev/null +++ b/Fuchs/Docs/Decisions/0035-invoice-date-is-datefinalized-everywhere.md @@ -0,0 +1,63 @@ +--- +status: Accepted +date: 2026-09-30 +applyTo: + - "Fuchs_Database/dbo/Functions/fds__fn_invoiceDate.sql" + - "Fuchs_Database/dbo/Functions/fds__r_getBalanceThisMonth.sql" + - "Fuchs_Database/dbo/Stored Procedures/fds__getDatevExports.sql" + - "Fuchs_Database/dbo/Stored Procedures/fds__getInvoices_list*.sql" + - "Fuchs_Database/dbo/Stored Procedures/fds__getFDSDocument.sql" + - "Fuchs_Database/dbo/Stored Procedures/fds__getReportDocument.sql" + - "Fuchs_Database/dbo/Stored Procedures/fds__getRequest_details.sql" + - "Fuchs_Database/dbo/Stored Procedures/fds__r_*.sql" + - "Fuchs_Database/dbo/Stored Procedures/fds__*Reminder*.sql" + - "Fuchs/code/InvoiceDates.cs" + - "Fuchs/Services/ReminderService.cs" + - "Fuchs/Services/*DraftEditService.cs" +supersededBy: "" +--- + +# 0035 — The invoice date is `DateFinalized` everywhere + +## Context + +ADR 0032 made `DateFinalized` the invoice date for the PDF, the e-invoice (BT-2) and the number +sequence, and introduced backdating (which only moves `DateFinalized`). Everything else — invoice +lists, revenue reports and charts, the DATEV export, document lookups, the request details — still +dated and grouped invoices by `DateCreated`, the moment the *draft* was created. A backdated invoice +therefore showed September on the document and October in every list, report and in DATEV, and any +invoice drafted in one month and finalised in the next had the same split. + +## Decision + +- **One invoice date, everywhere:** the German calendar day of `DateFinalized`, falling back to + `DateCreated` only for drafts. Both columns are stored in UTC. +- **One implementation per side:** `[dbo].[fds__fn_invoiceDate](DateFinalized, DateCreated)` in SQL and + `InvoiceDates.IssueDate` in C#. No proc converts or picks the date itself. +- Applies to: the DATEV export (period filter, `Belegdatum`, `Belegfeld 2`), the invoice lists + (`fds__getInvoices_list`, `list2`, `list_vario`: period filter, `Belegdatum`, `DateOfCreation`, + ordering, overdue fallback), the revenue reports (`fds__r_*`: year/month filters and grouping, + `fds__r_getBalanceThisMonth`), document lookups (`fds__getFDSDocument`, `fds__getReportDocument`), + `fds__getRequest_details` (new column `InvoiceDate`, shown in the request's invoice list), and the + invoice date shown in reminders (`fds__prepReminder`, `fds__createReminder`, `fds__getReminder`). +- **Reminders use the same rule for their own date:** the reminder PDF's date is the reminder's + `DateFinalized` (German day), draft: `DateCreated`. +- **No transition safeguard.** The switch applies to all periods, past and future; already exported + DATEV periods are not reconciled (confirmed by the business owner, 2026-09-30). +- `DateCreated` keeps its meaning — the creation timestamp of the row — and is still returned where + callers read it as such. Draft previews stamp it with `DateTime.UtcNow` to match the stored column. + +## Consequences + +- Reports and exports for a past period can differ from what they showed before this change: an + invoice drafted in month M and finalised in M+1 now counts in M+1. +- Filters on the invoice date are not SARGable (they were not before either: `CAST(DateCreated as date)`). + Acceptable at the current table size; an indexed computed column is the follow-up if it matters. +- Any new list, report or export that shows or groups invoices by date must use + `fds__fn_invoiceDate` — never `DateCreated` or a raw `DateFinalized`. + +## Alternatives considered + +- **Keep `DateCreated` in lists/reports, `DateFinalized` only on documents** — rejected: the same + invoice would carry two dates, and backdating would never reach the books. +- **Transition safeguard for already exported DATEV periods** — rejected by the business owner. diff --git a/Fuchs/Docs/Decisions/0036-database-project-build-is-the-tsql-gate.md b/Fuchs/Docs/Decisions/0036-database-project-build-is-the-tsql-gate.md new file mode 100644 index 0000000..a1f7e5b --- /dev/null +++ b/Fuchs/Docs/Decisions/0036-database-project-build-is-the-tsql-gate.md @@ -0,0 +1,85 @@ +--- +status: Accepted +date: 2026-09-30 +applyTo: + - "Fuchs_Database/**" +supersededBy: "" +--- + +# 0036 — The database project build is the T-SQL gate + +## Context + +A rewrite of `fds__getDatevExports` added a `JOIN @inv as i` next to `fds__invoices as iv` +and left an unqualified `[file_guid]` in the select list. SQL Server rejects that statement +with Msg 209 (ambiguous column name) — but only when it runs, and the working-tree SQL runs +nowhere: the schema lives in the `Fuchs_Database` SSDT project, the dev database only gets +what is explicitly published to it, and the xUnit suite cannot bind T-SQL. The defect reached +code review as the only check. + +The SSDT build would have caught it: it reported the line as `SQL71502` ("unresolved reference +… or ambiguous"). Nobody saw that because + +- the project did not build at all — the two `CREATE USER … FOR LOGIN` files referenced logins + that were not in the model, which SSDT treats as error `SQL71501`; +- the genuine warning sat among ~160 identical `SQL71502` warnings caused by references to + `sys.*`, `INFORMATION_SCHEMA`, `sp_executesql`, `sp_getapplock` (no `master` reference) and + to `ocms_fn_generatePassword`, an OCMS helper the project never contained; +- a warning does not fail anything. + +The same sweep found that `ocms_fn_generatePassword` (and its dependency `ocms_fn_randbetween`) +is missing on the dev database as well, so every id-generating function (`fds__fn_invoice_id`, +`fds__fn_reminder_id`, `fis_fn_id`, …) fails there with Msg 4121. + +## Decision + +1. `FuchsDatabase.sqlproj` references the `master` system dacpac + (`$(DacPacRootPath)\…\SqlServer\170\SQLSchemas\master.dacpac`), so system objects bind. +2. Everything the SQL references is in the project. The OCMS helpers `ocms_fn_generatePassword` + and `ocms_fn_randbetween` are vendored copies of the OCMSsharp `ocms_mt_database` files. + `Security/Logins.sql` scripts the two application logins with a placeholder, + `MUST_CHANGE` password so the users bind; real passwords stay in Key Vault and SSDT never + compares passwords, so existing logins are untouched on publish. +3. `TreatTSqlWarningsAsErrors` is on. Suppressed: `71501` (dynamic SQL / cross-database + references) and `71558` (identifier differs only by case — harmless under the `CI` model + collation). Every other T-SQL warning, in particular `SQL71502`, fails the build. +4. Building the database project is part of the workflow whenever `Fuchs_Database/**` changes + (`msbuild Fuchs_Database/FuchsDatabase.sqlproj -p:Configuration=Debug`, from the Visual + Studio MSBuild — `dotnet build` cannot build the legacy SSDT project format). A red database + build is a failure like a red C# build. +5. The C# side of the contract is a test: `Fuchs.Tests/SqlContractTests` scans every + `[dbo].[…]` named in C# strings (`Fuchs`, `Fuchs_DataService`) and checks it against the + SSDT files — the object exists, every `EXECUTE` binds (no unknown names, no surplus + positional arguments, every parameter without a default supplied), every function call + passes the declared argument count, and every `mfr__updt__*` proc declares the + `@tblname, @referencetable, @tgtid` signature `FdsMfrClient` calls dynamically. + +## Consequences + +- An unqualified column that becomes ambiguous, a typo in a column name, or a call to a + function that is not in the project is a build error before review, not a Msg 209/4121 at + a customer. +- `SELECT *` inside `EXISTS (…)` over joined tables trips `SQL71502` in SSDT even though SQL + Server accepts it; write `SELECT 1` there (done for `fds__fn_IntermediateIsAllocatedToOther` + and `fis_admin_testGroupMembership`). +- New procedures that use `sys.*`/`sp_*` need no suppression any more. A new reference that is + genuinely outside the model (another database, dynamic SQL) is suppressed per statement or + by adding the object to the project — never by widening `SuppressTSqlWarnings` for `71502`. +- A proc signature change that breaks a C# caller fails `dotnet test`, not the first request. + Only literal SQL is covered: dynamically built names (`FuchsVisualization`'s report procs, + resolved from `sys.parameters` at runtime) and result-set column names are not. +- The build proves binding, not behaviour: publishing to the dev database (`SqlPackage + /Action:Publish` with `ExcludeObjectTypes=Logins;Users;Permissions;RoleMembership`, or the + schema compare) and exercising the code path remains the runtime check. +- The dev database needs the two `ocms_*` helpers published before any id-generating path + works there. + +## Alternatives considered + +- **Run the changed procedures against the dev database before review.** Needs a publish of + every working-tree change first, and does not cover code paths the reviewer does not think + to exercise; the compile-time check is free and total. +- **Suppress `SQL71502` and keep the build warning-free that way.** Removes exactly the signal + that catches this class of bug. +- **A C#-side test that parses the SQL for unqualified columns.** A parser-level heuristic + without a schema cannot decide ambiguity; the SSDT model can. diff --git a/Fuchs/Docs/INVOICE_LIFECYCLE.md b/Fuchs/Docs/INVOICE_LIFECYCLE.md index c27bae6..5646cbb 100644 --- a/Fuchs/Docs/INVOICE_LIFECYCLE.md +++ b/Fuchs/Docs/INVOICE_LIFECYCLE.md @@ -181,6 +181,36 @@ Confirming the preview modal posts to **`req/sconf`** `[InvoiceId] = fds__newInvoiceId(YEAR())` → format `R-<0000>` (the draft only ever had the internal numeric `Id`). `Version` is bumped and any linked "replaces" bookkeeping (storno/credit chains) is updated. + - **Invoice date** = `DateFinalized` — printed on the PDF and used as the + e-invoice issue date (`InvoiceDates.IssueDate`, ADR 0032). + - **Backdating (ADR 0032):** users with `fds_inv > 2` see a checkbox in the + preview dialog (`inv/dpreview` returns `backdate`) to date the invoice to + the last working day (Mon–Fri) of the previous month, as long as no + invoice has been finalised after that day. `req/sconf` then passes + `@backdate = 1`; `fds__fn_invoiceBackdate` is re-checked and the proc + throws 60001 (nothing finalised) if it is no longer allowed. Number year and + `DueDate` follow the backdated day. The proc serializes all finalisations + (transaction + `sp_getapplock`) so the check and the numbering cannot + interleave with a concurrent finalisation. The controller maps 60001 to + the "create again without backdating" message; a 0-row result (already + final/sent, e.g. double submit) is reported as "already finalised". + - **Same date everywhere (ADR 0035):** invoice lists, revenue reports, + the DATEV export (period + `Belegdatum`), request details and reminders + all use `[dbo].[fds__fn_invoiceDate]` — `DateFinalized` as German + calendar day, drafts fall back to `DateCreated` — so a backdated invoice + appears in the previous month everywhere, including DATEV. The reminder + PDF's own date follows the same rule (reminder `DateFinalized`). + - **Abschlagsrechnungen (ADR 0034):** `IntInvoiceAllocation` lines carry the + credited intermediate invoice in `reference_InvId` (seeded by + `fds__prepInvoice` and `fds__prepStorno_recreate`, round-tripped by the + editor as item `ref`); finalisation records it in + `fds__invoice_details.AllocatedTo_InvId` so the same Abschlagsrechnung is + not offered again. The claim only counts while the crediting invoice is + alive: once it is cancelled (storno, or replaced via storno + recreate) + `fds__fn_IntermediateIsAllocatedToOther` treats the Abschlagsrechnung as + free again and the next finalisation takes the allocation over. A + Stornorechnung (`'c'`) never claims an allocation, even though a storno + copy mirrors the credit lines. 2. On success (`IsFinal == true` returned), the controller: - Reloads the invoice via `LoadInvoiceAsync`. - Calls `StoreInvoiceDocumentFileAsync` → renders the **final** PDF @@ -283,7 +313,7 @@ Once an invoice is `IsFinal`, the request/invoice list menus | **View / display PDF** | `$inv.disp(id, 'inv')` | `inv/rdoc` | Renders page images for on-screen display only. If a finalised, non-external invoice has no stored PDF, it is regenerated and persisted first (ADR 0025) | | **Download / open PDF** | `req/idoc` or `inv/pget`-derived | `req/idoc` | Serves the stored (or freshly rendered) PDF inline | | **Mark paid / unpaid** | `$inv.setPyd`/`setUpd` | `inv/setpyd` / `inv/setupd` | `fds__setInvoicePayed` / `fds__setInvoiceUNPayed` | -| **Storno (cancel)** | `$inv.storno` → `$inv.cSt` | `inv/storno` (mode `simple`/`copy`) | `fds__createStorno_simple` / `fds__createStorno_copy`; the replaced invoice is cross-linked (`Replaces_InvId`) and cancelled once the storno itself is finalised | +| **Storno (cancel)** | `$inv.storno` → `$inv.cSt` (first `inv/pget`: refreshes mfr entities only for numeric mfr ids, no-op for Intranet ids) | `inv/storno` (mode `simple`/`copy`) | `fds__createStorno_simple` / `fds__createStorno_copy`; the replaced invoice is cross-linked (`Replaces_InvId`) and cancelled once the storno itself is finalised | | **Credit note** | `$inv.credit` → `$inv.cSt` | `inv/credit` (mode `credit`) | `fds__createCredit_simple` — same preview/finalise/email loop as a normal invoice | | **Continue editing a draft** | `$inv.cntInv` / `clCntInv` | `inv/get` | Only available while `isFinal == false`; re-opens the same stateless editor | diff --git a/Fuchs/Docs/USER_GUIDE.md b/Fuchs/Docs/USER_GUIDE.md index 4119204..639279f 100644 --- a/Fuchs/Docs/USER_GUIDE.md +++ b/Fuchs/Docs/USER_GUIDE.md @@ -49,6 +49,11 @@ Serviceaufträge kommen aus dem MFR-ERP-System und werden regelmäßig automatis ### Erstellen / Bearbeiten 1. Aus einem Serviceauftrag eine Rechnung **vorbereiten** → Vorschau prüfen. 2. **Speichern** (Entwurf) oder weiter **bearbeiten**. Entwürfe tragen ein Wasserzeichen. +3. **Rechnung erstellen** in der Vorschau vergibt Rechnungsnummer und Rechnungsdatum (= Tag der Erstellung). + - **Rechnungsdatum Vormonat (nur Admins):** Solange im neuen Monat noch keine Rechnung erstellt wurde, + erscheint in der Vorschau das Häkchen „Rechnungsdatum auf den letzten Werktag des Vormonats setzen + (TT.MM.JJJJ)“. Gesetzt, erhält die Rechnung dieses Datum; Rechnungsnummer und Fälligkeit richten sich + danach. Werktage sind Mo–Fr (Feiertage werden nicht berücksichtigt). ### Sets (Positionen zusammenfassen) - Ein **Set** aus mfr fasst die darauf folgenden Positionen zusammen; mit **„Auf Setpreis diff --git a/Fuchs/Observability/FuchsTelemetry.cs b/Fuchs/Observability/FuchsTelemetry.cs index 164dc84..3436913 100644 --- a/Fuchs/Observability/FuchsTelemetry.cs +++ b/Fuchs/Observability/FuchsTelemetry.cs @@ -57,6 +57,9 @@ public static class FuchsTelemetry public static readonly Counter BlobBackupCopiesFailed = Meter.CreateCounter("fuchs.blobstorage.backupcopies.failed", "{copy}", "Number of blob backup-copy attempts that failed."); + public static readonly Counter InvoicesBackdated = + Meter.CreateCounter("fuchs.invoices.backdated", "{invoice}", + "Invoice finalisations with the admin backdate option (ADR 0032), tagged by outcome."); public static readonly Counter InvoiceFileBackups = Meter.CreateCounter("fuchs.invoice.filebackups", "{backup}", "Admin-triggered invoice file backup+clear actions (Do_Process_Admin backupclearinvoicefile), tagged by outcome."); diff --git a/Fuchs/Services/AzureBlobStorageService.cs b/Fuchs/Services/AzureBlobStorageService.cs index a44a054..97dc65d 100644 --- a/Fuchs/Services/AzureBlobStorageService.cs +++ b/Fuchs/Services/AzureBlobStorageService.cs @@ -135,6 +135,12 @@ public class AzureBlobStorageService : IBlobStorageService Response response = await blobClient.ExistsAsync(cancellationToken); return response.Value; } + catch (OperationCanceledException) when (cancellationToken.IsCancellationRequested) + { + // Caller cancelled (e.g. app shutdown during the startup backfill) — not a storage failure; + // reporting "not archived" here made the backfill go on to a doomed upload logged as an error. + throw; + } catch (Exception ex) { _logger.LogWarning(ex, "Blob existence check failed for {Container}/{Blob} — treating as not archived.", @@ -270,6 +276,11 @@ public class AzureBlobStorageService : IBlobStorageService category, documentId, containerName, blobName); return blobClient.Uri; } + catch (OperationCanceledException) when (cancellationToken.IsCancellationRequested) + { + _logger.LogDebug("Blob upload cancelled for {Category} {Id} (caller cancelled).", category, documentId); + throw; + } catch (Exception ex) { FuchsTelemetry.BlobUploadsFailed.Add(1, new KeyValuePair("category", category)); diff --git a/Fuchs/Services/ERechnungMapper.cs b/Fuchs/Services/ERechnungMapper.cs index 9f3795c..4918592 100644 --- a/Fuchs/Services/ERechnungMapper.cs +++ b/Fuchs/Services/ERechnungMapper.cs @@ -259,13 +259,7 @@ public static class ERechnungMapper } // ── helpers ──────────────────────────────────────────────────────────────── - private static DateOnly IssueDate(GenericObjectDictionary? reg) - { - foreach (var key in new[] { "DateFinalized", "DateCreated" }) - if (reg?.getString(key) is { Length: > 0 } s && DateTime.TryParse(s, CultureInfo.InvariantCulture, DateTimeStyles.None, out var dt)) - return DateOnly.FromDateTime(dt); - return DateOnly.FromDateTime(DateTime.Today); - } + private static DateOnly IssueDate(GenericObjectDictionary? reg) => InvoiceDates.IssueDate(reg); /// Normalises a raw country value (ISO alpha-2, or a German/English name) to a country code. internal static CountryCode NormalizeCountry(string? raw) diff --git a/Fuchs/Services/IBlobStorageService.cs b/Fuchs/Services/IBlobStorageService.cs index 3a35fa6..79b2bac 100644 --- a/Fuchs/Services/IBlobStorageService.cs +++ b/Fuchs/Services/IBlobStorageService.cs @@ -12,7 +12,8 @@ public interface IBlobStorageService /// supplied (typically FdsInvoiceData.InvoiceRegistration), blob metadata is projected from /// it using — see . /// Returns the blob URI, or null when storage is disabled/unconfigured - /// or the upload failed — failures never break the primary DB-storage flow. + /// or the upload failed — failures never break the primary DB-storage flow. Only a cancelled + /// surfaces, as . /// Task UploadInvoicePdfAsync(string invoiceId, string fileName, byte[] content, IReadOnlyDictionary? sourceRow = null, CancellationToken cancellationToken = default); @@ -50,7 +51,8 @@ public interface IBlobStorageService /// /// Returns true if a blob already exists for the given container/document/filename /// combination. Used by the startup backfill to skip documents that were already archived. - /// Returns false (never throws) when storage is disabled/unconfigured or the check fails. + /// Returns false when storage is disabled/unconfigured or the check fails; throws only + /// when is cancelled. /// Task ExistsAsync(string containerName, string documentId, string fileName, CancellationToken cancellationToken = default); diff --git a/Fuchs/Services/InvoiceDraftEditService.cs b/Fuchs/Services/InvoiceDraftEditService.cs index e8172cd..5d85364 100644 --- a/Fuchs/Services/InvoiceDraftEditService.cs +++ b/Fuchs/Services/InvoiceDraftEditService.cs @@ -616,7 +616,8 @@ public sealed class InvoiceDraftEditService : IInvoiceDraftService ["SendToAddressJson"] = InvoiceRecipientAddress.FromCustomValues(Str(session.New["CustomValues"]))? .ToJson().ToString(Newtonsoft.Json.Formatting.None) ?? "", ["InvoiceOptions"] = BuildInvoiceOptions(session), - ["DateCreated"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture) + // UTC like the stored column — InvoiceDates.IssueDate converts it to the German day + ["DateCreated"] = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture) }; int idx = 0; diff --git a/Fuchs/Services/InvoiceService.cs b/Fuchs/Services/InvoiceService.cs index ce849eb..1bd8da3 100644 --- a/Fuchs/Services/InvoiceService.cs +++ b/Fuchs/Services/InvoiceService.cs @@ -205,6 +205,17 @@ public class InvoiceService : IInvoiceService /// The whole set is cleared and rewritten on every call — simpler and safer than diffing — /// mirroring the legacy fds__invoice_data.RegisterInvoice_V1 (VB) behaviour. /// + /// + /// Normalises an item's posted ref (the invoice a CanceledInvoice / IntInvoiceAllocation line + /// points at) for fds__invoice_items.reference_InvId (varchar(20)); null when absent or not an id. + /// + internal static string? ItemReferenceInvId(string? raw) + { + string s = (raw ?? "").Trim(); + if (s.Length == 0 || s.Length > 20 || s.Equals("null", StringComparison.OrdinalIgnoreCase)) return null; + return s.All(char.IsAsciiLetterOrDigit) ? s : null; + } + private async Task PersistInvoiceLineItemsAsync(FdsInvoiceData invoice, string userAccountId, DatabaseSecurity dbSec) { string invoiceId = invoice.Id; @@ -269,6 +280,7 @@ public class InvoiceService : IInvoiceService float vs = 0; if (TryCastSingle(itmDic.getItem("vs"), ref vs)) row["value_service"] = (decimal)vs; row["det"] = itmDic.no("det", false) is true; + if (ItemReferenceInvId(itmDic.nz("ref")) is { } refInvId) row["reference_InvId"] = refInvId; row["SortOrder"] = (byte)Math.Clamp(itemSort, 0, 255); itemsTable.Rows.Add(row); } @@ -302,7 +314,9 @@ public class InvoiceService : IInvoiceService : Array.Empty(), AdminUser = reg?.getString("UserNameFinalized") ?? "", AdminUserEmail = reg?.getString("UserEmailFinalized") ?? "", - AdminDatumValue = reg?.getString("DateCreated") is { Length: > 0 } dc ? DateTime.Parse(dc) : DateTime.Now + // Rechnungsdatum = DateFinalized (incl. backdating), draft: DateCreated — same source as the + // e-invoice issue date (ERechnungMapper), see InvoiceDates / ADR 0032. + AdminDatumValue = InvoiceDates.IssueDate(reg).ToDateTime(TimeOnly.MinValue) }; var inlineImages = await ResolveInlineImagesAsync(invoice); var doc = await _pdf.WriteLetterAsync(tb, draft); diff --git a/Fuchs/Services/ReminderDraftEditService.cs b/Fuchs/Services/ReminderDraftEditService.cs index 709678a..c608039 100644 --- a/Fuchs/Services/ReminderDraftEditService.cs +++ b/Fuchs/Services/ReminderDraftEditService.cs @@ -271,7 +271,8 @@ public sealed class ReminderDraftEditService : IReminderDraftService ["invoices"] = invoices, ["CustomValues"] = Str(session.New["CustomValues"]), ["IsFinal"] = false, - ["DateCreated"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture) + // UTC like the stored column — InvoiceDates.IssueDate converts it to the German day + ["DateCreated"] = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture) }; return new GenericObjectDictionary(d); } diff --git a/Fuchs/Services/ReminderService.cs b/Fuchs/Services/ReminderService.cs index 2f3b278..e61eba2 100644 --- a/Fuchs/Services/ReminderService.cs +++ b/Fuchs/Services/ReminderService.cs @@ -111,7 +111,8 @@ public class ReminderService : IReminderService Address = reminder.InvoiceAddress, AdminUser = reminder.UserNameFinalized, AdminUserEmail = reminder.UserEmailFinalized, - AdminDatumValue = reminder.DateCreated ?? DateTime.Now + // Reminder date = DateFinalized, draft: DateCreated — same rule as the invoice date (ADR 0035) + AdminDatumValue = InvoiceDates.IssueDate(reminder.ReminderRegistration).ToDateTime(TimeOnly.MinValue) }; if (!string.IsNullOrEmpty(reminder.RawCustomValues)) { diff --git a/Fuchs/code/FdsReminderData.cs b/Fuchs/code/FdsReminderData.cs index 75bf51f..5e4491a 100644 --- a/Fuchs/code/FdsReminderData.cs +++ b/Fuchs/code/FdsReminderData.cs @@ -32,7 +32,6 @@ public class FdsReminderData internal string RawCustomValues => NewValues?.nz("CustomValues").Trim() ?? ""; // -- Computed props from registration ------------------------------------- - public DateTime? DateCreated => ReminderRegistration?.getString("DateCreated") is { Length: > 0 } d ? DateTime.Parse(d) : null; public string ReminderType => ReminderRegistration?.getString("type").Substr(0, 1) ?? ""; public string UserNameFinalized => ReminderRegistration?.getString("UserNameFinalized") ?? ""; public string UserEmailFinalized => ReminderRegistration?.getString("UserEmailFinalized") ?? ""; diff --git a/Fuchs/code/InvoiceDates.cs b/Fuchs/code/InvoiceDates.cs new file mode 100644 index 0000000..2ee6b21 --- /dev/null +++ b/Fuchs/code/InvoiceDates.cs @@ -0,0 +1,86 @@ +using static OCORE.OCORE_dictionaries; + +namespace Fuchs.intranet; + +/// Result of a fds__setInvoiceFinal call as seen by req/sconf. +public enum InvoiceFinalizeOutcome +{ + /// The draft was finalized (one row returned). + Finalized, + /// SQL error 60001: no longer allowed to backdate; nothing was finalized. + BackdateNotAllowed, + /// No error but no row: the invoice is already final/sent (or unknown); nothing was changed. + AlreadyFinal, + /// Any other SQL error (authorization 60000, constraint, timeout ...). + Error +} + +/// +/// The invoice date ("Rechnungsdatum") printed on the PDF and carried as the e-invoice issue date +/// (BT-2). One source for both so they can never disagree (ADR 0032): +/// DateFinalized (the finalisation — or, for a backdated invoice, the backdated — date), +/// falling back to DateCreated for drafts. Both columns are written with GETUTCDATE(), +/// so the value is converted to the German calendar day. +/// +public static class InvoiceDates +{ + private static readonly TimeZoneInfo German = ResolveGermanZone(); + + public static DateOnly IssueDate(GenericObjectDictionary? registration, DateTime? utcNow = null) + { + DateTime? stored = registration?.getDate_null("DateFinalized") ?? registration?.getDate_null("DateCreated"); + DateTime utc = stored ?? utcNow ?? DateTime.UtcNow; + return DateOnly.FromDateTime(ToGermanTime(utc)); + } + + /// Parses the ISO date returned by fds__fn_invoiceBackdate; null when empty/invalid. + public static DateOnly? ParseBackdate(string? iso) + => DateOnly.TryParseExact((iso ?? "").Trim(), "yyyy-MM-dd", System.Globalization.CultureInfo.InvariantCulture, + System.Globalization.DateTimeStyles.None, out var d) ? d : null; + + /// True when the finalise request asked for backdating (checkbox value "1"/"true"). + public static bool IsBackdateRequested(string? formValue) + => (formValue ?? "").Trim().ToLowerInvariant() is "1" or "true" or "on"; + + /// SQL error number of THROW 60001, 'backdating not allowed' in fds__setInvoiceFinal. + public const int BackdateNotAllowedErrorNumber = 60001; + + /// + /// Classifies what fds__setInvoiceFinal did, from the OCORE result: an exception (with the SQL + /// error number), or the number of rows the guarded UPDATE ... WHERE isFinal = 0 AND isSent = 0 + /// returned. Only the dedicated 60001 means "backdating no longer allowed"; a 0-row result means the + /// invoice was already final/sent (e.g. a double submit) — reporting that as a backdate rejection + /// would invite the user to create a duplicate. + /// + public static InvoiceFinalizeOutcome ClassifyFinalizeResult(string? sqlException, int? sqlErrorNumber, int rowCount) + { + if (!string.IsNullOrEmpty(sqlException)) + return sqlErrorNumber == BackdateNotAllowedErrorNumber + ? InvoiceFinalizeOutcome.BackdateNotAllowed + : InvoiceFinalizeOutcome.Error; + return rowCount > 0 ? InvoiceFinalizeOutcome.Finalized : InvoiceFinalizeOutcome.AlreadyFinal; + } + + /// Tag value for the fuchs.invoices.backdated counter's outcome dimension. + public static string OutcomeTag(InvoiceFinalizeOutcome outcome) => outcome switch + { + InvoiceFinalizeOutcome.Finalized => "ok", + InvoiceFinalizeOutcome.BackdateNotAllowed => "rejected", + InvoiceFinalizeOutcome.AlreadyFinal => "already_final", + _ => "error" + }; + + internal static DateTime ToGermanTime(DateTime utc) + => TimeZoneInfo.ConvertTimeFromUtc(DateTime.SpecifyKind(utc, DateTimeKind.Utc), German); + + private static TimeZoneInfo ResolveGermanZone() + { + foreach (var id in new[] { "Europe/Berlin", "W. Europe Standard Time" }) + { + try { return TimeZoneInfo.FindSystemTimeZoneById(id); } + catch (TimeZoneNotFoundException) { } + catch (InvalidTimeZoneException) { } + } + return TimeZoneInfo.Local; + } +} diff --git a/Fuchs/css/intranet/oci_basic.scss b/Fuchs/css/intranet/oci_basic.scss index 1b62310..bbda9c7 100644 --- a/Fuchs/css/intranet/oci_basic.scss +++ b/Fuchs/css/intranet/oci_basic.scss @@ -247,6 +247,21 @@ div.modal { } .modal-body { + /* admin "Rechnungsdatum Vormonat" option in the invoice preview dialog (ADR 0032) */ + > .imagecollection > label.backdate { + display: block; + margin: 0 0 1rem 0; + padding: 0.5rem 1rem; + background-color: #fff8e1; + border: 1px solid #f0c36d; + font-weight: bold; + cursor: pointer; + + > input { + margin-right: 0.5rem; + } + } + > .choicefrm { padding: 1rem; diff --git a/Fuchs/js/intranet/modules/fis.inv_shared.js b/Fuchs/js/intranet/modules/fis.inv_shared.js index 7378ab4..9dd68f2 100644 --- a/Fuchs/js/intranet/modules/fis.inv_shared.js +++ b/Fuchs/js/intranet/modules/fis.inv_shared.js @@ -394,6 +394,14 @@ $inv.d = { l.rC('freeze'); let c = $$.dc('imagecollection pdfpreview'), vhr = Math.round(vh() * 0.88), total = response.total; if (total > 10) { $$.dc('note warn', c).text($ict.tpe); } + /* Admin-only (fds_inv > 2, decided server-side): date the invoice to the last working day of + the previous month, offered only until an invoice has been created in the new month (ADR 0032). */ + let bdChk = null; + if ((response.backdate || '') !== '') { + let bdRow = $('').addClass('backdate').attr('title', $ict.bdTT).appendTo(c); + bdChk = $('').appendTo(bdRow); + $$.s(string($ict.bdLbl, [response.backdate.split('-').reverse().join('.')])).appendTo(bdRow); + } $.each(response.img || [], (ii, img) => { $$.dc('pdfp', c).append($$.img(img).css('max-height', (vhr - rpx(6)).toString() + 'px')); }); for (let ic = (response.img || []).length + 1; ic <= total; ic++) { $$.dc('pdfp ph', c).append($$.dc('note', $ict.pna)); } $ocms.dlg(c, { @@ -403,7 +411,7 @@ $inv.d = { $ocms.postXT({ url: $ocms.url('inv/dsave'), data: { token: t }, success: (sv) => { $ocms.postXT({ - url: $ocms.url('req/sconf'), data: { id: sv.invid }, success: (cresp) => { + url: $ocms.url('req/sconf'), data: { id: sv.invid, backdate: (bdChk && bdChk.is(':checked')) ? 1 : 0 }, success: (cresp) => { ct.trigger('modal_close'); if (cresp.hasFile === true) { window.open($ocms.url('req/idoc') + '?id=' + sv.invid, '_blank'); } $inv.d.close(); @@ -703,7 +711,7 @@ $inv.cInv2 = function (data) { lihd.append($$.sc('dli').click(function () { $inv.disp(ix.Id, 'inv'); })); } lihd.append($$.sc('nme', ix.DocumentName || ix.Id)); - $$.dc('lidt', ili).append([$$.dc('wda').append([$$.s(fdt(ix.DateCreated, 'dd.MM.yyyy'))]), $$.d().text($ict.iSt[ix.invstatus] || ix.invstatus)]); + $$.dc('lidt', ili).append([$$.dc('wda').append([$$.s(fdt(ix.InvoiceDate || ix.DateCreated, 'dd.MM.yyyy'))]), $$.d().text($ict.iSt[ix.invstatus] || ix.invstatus)]); }); } @@ -878,13 +886,16 @@ $inv.ccStInv = function (ev) { // Stornorechnung rif.tbl.children('tbody').each($inv.bdysort); rif.tbl.trigger('fds.inv'); /* trigger calculations */ + }, error: (xhr) => { + alert($t.f1 + (xhr && xhr.status ? xhr.status : '')); }, complete: () => { o.c.trigger('modal_close'); } }); - }, error: () => { + }, error: (xhr) => { if (o) { o.c.trigger('modal_close'); } + alert($t.f1 + (xhr && xhr.status ? xhr.status : '')); } }); }; @@ -1011,13 +1022,16 @@ $inv.cSt = function (data) { rif.tbl.children('tbody').each($inv.bdysort); rif.tbl.trigger('fds.inv'); /* trigger calculations */ + }, error: (xhr) => { + alert($t.f1 + (xhr && xhr.status ? xhr.status : '')); }, complete: () => { o.c.trigger('modal_close'); } }); - }, error: () => { + }, error: (xhr) => { if (o) { o.c.trigger('modal_close'); } + alert($t.f1 + (xhr && xhr.status ? xhr.status : '')); } }); }; @@ -1331,7 +1345,7 @@ $inv.rrw = function () { } else if (rw.is('.itm.osum') === true) { co = { invrqid: dta.InvRqId, id: 'osum' + rw.index(), typ: 'osum', p: '', q: null, t: oHtml(dta.tbl.tbl), tt: null, v: null, vt: dta.net_val, vs: dta.svcnet_val, vat: dta.vat, vv: dta.vat_val, vsv: dta.svcvat_val, det: false }; } else { - co = { invrqid: dta.InvRqId, id: dta.Id || '', typ: dta.Type || 'other', p: '', q: null, t: '', tt: null, v: null, vt: dta.net_val, vs: dta.svcnet_val, vat: dta.vat, vv: dta.vat_val, vsv: dta.svcvat_val, det: (dta.Note || '') !== '' && hn === false, SetItmId: dta.SetItmId || null, lvl: (dta.lvl || 0) }; + co = { invrqid: dta.InvRqId, id: dta.Id || '', typ: dta.Type || 'other', p: '', q: null, t: '', tt: null, v: null, vt: dta.net_val, vs: dta.svcnet_val, vat: dta.vat, vv: dta.vat_val, vsv: dta.svcvat_val, det: (dta.Note || '') !== '' && hn === false, SetItmId: dta.SetItmId || null, lvl: (dta.lvl || 0), ref: dta.reference_InvId || null }; $$.dc('ibtn ico move', axf, { title: $rct.mR }); /* should be the last added */ /* dta.position is '' (not unset) for a Text/Title row once invSumUpdate has numbered the diff --git a/Fuchs/js/intranet/modules/fis.inv_txt_de.js b/Fuchs/js/intranet/modules/fis.inv_txt_de.js index 5a02024..f70bb25 100644 --- a/Fuchs/js/intranet/modules/fis.inv_txt_de.js +++ b/Fuchs/js/intranet/modules/fis.inv_txt_de.js @@ -36,6 +36,8 @@ ivE: 'Die Email-Adresse ist vermutlich nicht gültig.', ivEc: '\nMöchten Sie fortfahren?', pna: 'Diese Seite ist in der Vorschau nicht verfügbar', + bdLbl: 'Rechnungsdatum auf den letzten Werktag des Vormonats setzen ({0})', + bdTT: 'Nur möglich, solange im neuen Monat noch keine Rechnung erstellt wurde. Rechnungsnummer und Fälligkeit richten sich nach diesem Datum.', tpe: 'Die Anzahl von {0} Seiten wird aktuell nicht unterstützt', eis: 'Der Rechnungsentwurf konnte nicht gespeichert werden.', pvw: 'Das Dokument wird abgerufen und für die Vorschau aufbereitet.\nDer Vorgang kann bis zu 2 Minuten dauern.', diff --git a/Fuchs/wwwroot/web/fis.css b/Fuchs/wwwroot/web/fis.css index c8c825e..97b1086 100644 --- a/Fuchs/wwwroot/web/fis.css +++ b/Fuchs/wwwroot/web/fis.css @@ -1309,6 +1309,21 @@ div.modal > .modal-dialog > .modal-content .modal-header, div.modal > .modal-dia div.modal > .modal-dialog > .modal-content .modal-header + div, div.modal > .modal-dialog > .modal-content .modal-body + div, div.modal > .modal-dialog > .modal-content .modal-footer + div, div.modal > .modal-dialog > .modal-content .modal-note + div { border-top: 1px solid #e5e5e5; } +div.modal > .modal-dialog > .modal-content .modal-body { + /* admin "Rechnungsdatum Vormonat" option in the invoice preview dialog (ADR 0032) */ +} +div.modal > .modal-dialog > .modal-content .modal-body > .imagecollection > label.backdate { + display: block; + margin: 0 0 1rem 0; + padding: 0.5rem 1rem; + background-color: #fff8e1; + border: 1px solid #f0c36d; + font-weight: bold; + cursor: pointer; +} +div.modal > .modal-dialog > .modal-content .modal-body > .imagecollection > label.backdate > input { + margin-right: 0.5rem; +} div.modal > .modal-dialog > .modal-content .modal-body > .choicefrm { padding: 1rem; } diff --git a/Fuchs/wwwroot/web/fis.inv.de.js b/Fuchs/wwwroot/web/fis.inv.de.js index c206902..a7e41e3 100644 --- a/Fuchs/wwwroot/web/fis.inv.de.js +++ b/Fuchs/wwwroot/web/fis.inv.de.js @@ -160,6 +160,8 @@ let $ict = { ivE: 'Die Email-Adresse ist vermutlich nicht gültig.', ivEc: '\nMöchten Sie fortfahren?', pna: 'Diese Seite ist in der Vorschau nicht verfügbar', + bdLbl: 'Rechnungsdatum auf den letzten Werktag des Vormonats setzen ({0})', + bdTT: 'Nur möglich, solange im neuen Monat noch keine Rechnung erstellt wurde. Rechnungsnummer und Fälligkeit richten sich nach diesem Datum.', tpe: 'Die Anzahl von {0} Seiten wird aktuell nicht unterstützt', eis: 'Der Rechnungsentwurf konnte nicht gespeichert werden.', pvw: 'Das Dokument wird abgerufen und für die Vorschau aufbereitet.\nDer Vorgang kann bis zu 2 Minuten dauern.', @@ -974,6 +976,14 @@ $inv.d = { l.rC('freeze'); let c = $$.dc('imagecollection pdfpreview'), vhr = Math.round(vh() * 0.88), total = response.total; if (total > 10) { $$.dc('note warn', c).text($ict.tpe); } + /* Admin-only (fds_inv > 2, decided server-side): date the invoice to the last working day of + the previous month, offered only until an invoice has been created in the new month (ADR 0032). */ + let bdChk = null; + if ((response.backdate || '') !== '') { + let bdRow = $('').addClass('backdate').attr('title', $ict.bdTT).appendTo(c); + bdChk = $('').appendTo(bdRow); + $$.s(string($ict.bdLbl, [response.backdate.split('-').reverse().join('.')])).appendTo(bdRow); + } $.each(response.img || [], (ii, img) => { $$.dc('pdfp', c).append($$.img(img).css('max-height', (vhr - rpx(6)).toString() + 'px')); }); for (let ic = (response.img || []).length + 1; ic <= total; ic++) { $$.dc('pdfp ph', c).append($$.dc('note', $ict.pna)); } $ocms.dlg(c, { @@ -983,7 +993,7 @@ $inv.d = { $ocms.postXT({ url: $ocms.url('inv/dsave'), data: { token: t }, success: (sv) => { $ocms.postXT({ - url: $ocms.url('req/sconf'), data: { id: sv.invid }, success: (cresp) => { + url: $ocms.url('req/sconf'), data: { id: sv.invid, backdate: (bdChk && bdChk.is(':checked')) ? 1 : 0 }, success: (cresp) => { ct.trigger('modal_close'); if (cresp.hasFile === true) { window.open($ocms.url('req/idoc') + '?id=' + sv.invid, '_blank'); } $inv.d.close(); @@ -1283,7 +1293,7 @@ $inv.cInv2 = function (data) { lihd.append($$.sc('dli').click(function () { $inv.disp(ix.Id, 'inv'); })); } lihd.append($$.sc('nme', ix.DocumentName || ix.Id)); - $$.dc('lidt', ili).append([$$.dc('wda').append([$$.s(fdt(ix.DateCreated, 'dd.MM.yyyy'))]), $$.d().text($ict.iSt[ix.invstatus] || ix.invstatus)]); + $$.dc('lidt', ili).append([$$.dc('wda').append([$$.s(fdt(ix.InvoiceDate || ix.DateCreated, 'dd.MM.yyyy'))]), $$.d().text($ict.iSt[ix.invstatus] || ix.invstatus)]); }); } @@ -1458,13 +1468,16 @@ $inv.ccStInv = function (ev) { // Stornorechnung rif.tbl.children('tbody').each($inv.bdysort); rif.tbl.trigger('fds.inv'); /* trigger calculations */ + }, error: (xhr) => { + alert($t.f1 + (xhr && xhr.status ? xhr.status : '')); }, complete: () => { o.c.trigger('modal_close'); } }); - }, error: () => { + }, error: (xhr) => { if (o) { o.c.trigger('modal_close'); } + alert($t.f1 + (xhr && xhr.status ? xhr.status : '')); } }); }; @@ -1591,13 +1604,16 @@ $inv.cSt = function (data) { rif.tbl.children('tbody').each($inv.bdysort); rif.tbl.trigger('fds.inv'); /* trigger calculations */ + }, error: (xhr) => { + alert($t.f1 + (xhr && xhr.status ? xhr.status : '')); }, complete: () => { o.c.trigger('modal_close'); } }); - }, error: () => { + }, error: (xhr) => { if (o) { o.c.trigger('modal_close'); } + alert($t.f1 + (xhr && xhr.status ? xhr.status : '')); } }); }; @@ -1911,7 +1927,7 @@ $inv.rrw = function () { } else if (rw.is('.itm.osum') === true) { co = { invrqid: dta.InvRqId, id: 'osum' + rw.index(), typ: 'osum', p: '', q: null, t: oHtml(dta.tbl.tbl), tt: null, v: null, vt: dta.net_val, vs: dta.svcnet_val, vat: dta.vat, vv: dta.vat_val, vsv: dta.svcvat_val, det: false }; } else { - co = { invrqid: dta.InvRqId, id: dta.Id || '', typ: dta.Type || 'other', p: '', q: null, t: '', tt: null, v: null, vt: dta.net_val, vs: dta.svcnet_val, vat: dta.vat, vv: dta.vat_val, vsv: dta.svcvat_val, det: (dta.Note || '') !== '' && hn === false, SetItmId: dta.SetItmId || null, lvl: (dta.lvl || 0) }; + co = { invrqid: dta.InvRqId, id: dta.Id || '', typ: dta.Type || 'other', p: '', q: null, t: '', tt: null, v: null, vt: dta.net_val, vs: dta.svcnet_val, vat: dta.vat, vv: dta.vat_val, vsv: dta.svcvat_val, det: (dta.Note || '') !== '' && hn === false, SetItmId: dta.SetItmId || null, lvl: (dta.lvl || 0), ref: dta.reference_InvId || null }; $$.dc('ibtn ico move', axf, { title: $rct.mR }); /* should be the last added */ /* dta.position is '' (not unset) for a Text/Title row once invSumUpdate has numbered the diff --git a/Fuchs/wwwroot/web/fis.inv.de.min.js b/Fuchs/wwwroot/web/fis.inv.de.min.js index c46f6d6..73f28e5 100644 --- a/Fuchs/wwwroot/web/fis.inv.de.min.js +++ b/Fuchs/wwwroot/web/fis.inv.de.min.js @@ -1 +1 @@ -let $rct={mdl:"Aufträge",or:"offene Aufträge",orr:"offene Aufträge (4 W)",rn:"Auftragsnummer",iov:{all:"Auftragsübersicht (alle)","":"Auftragsübersicht"},wk:"Woche",nd:"Keine Daten gefunden.",h:"Uhr",rq1:"Auftragsdaten werden von MFR abgerufen.\nDer Vorgang kann bis zu 90Sek dauern.",rq2:"Auftragsdaten werden geladen",rq1f:"Die Auftragsdaten von MFR konnten nicht oder nicht schnell genug abgerufen werde.\nMöchten Sie mit den bestehenden Daten trotzdem weitermachen?",note1:"Im Bruttobetrag sind {0} Lohnkosten enthalten (netto {1}). Die darin enthaltene Umsatzsteuer beträgt {2}.",note2:"Bitte beachten Sie, nach §14 Abs. 1 Umsatzsteuergesetz ist diese Rechnung ein Zahlungsbeleg oder eine andere beweiskräftige Unterlage für 2 Jahre nach Ablauf des Kalenderjahres der Ausstellung dieser Rechnung aufzubewahren, soweit nicht aufgrund anderer gesetzlicher Regelungen andere ggf.längere Aufbewahrungsfristen gelten.",note3:"Privathaushalten erstattet das Finanzamt bis zu {0} des Arbeitslohns mit der nächsten Steuererklärung.",note4:"Für bereits erbrachte Arbeiten, Dienstleistungen, Materiallieferungen und getätigte Bestellvorgänge zum oben genannten Bauvorhaben, die sich aus dem mit Ihnen geschlossenen Vertrag ergeben, stellen wir Ihnen vertragsgemäß unsere Akontozahlung in Rechnung. Eine Endabrechnung erhalten Sie als Schlussrechnung nach Abschluss des gesamten Bauvorhabens. Das Ausführungsdatum entnehmen Sie bitte dem Schlusstext dieser Rechnung. Wir danken Ihnen herzlich für das entgegengebrachte Vertrauen und bitten Sie um kurzfristigen Ausgleich der Akontorechnung.",note13b:"Gem. §13b Umsatzsteuergesetz unterliegen Sie der Steuerschuldnerschaft des Leistungsempfängers zur Umsatzsteuer aus dieser Rechnung mit einem Steuersatz von 19%.",crI:"Rechnung erstellen",crII:"Abschlagsrechnung erstellen",dII:"Für eine Abschlagsrechnung darf nur ein Auftrag gewählt werden.",dnS:"Für eine Rechnung muss mindestens ein Auftrag gewählt werden.",inv:"Rechnung",invs:"Rechnungen",req:"Auftrag",provP:"Leistungszeitraum",provD:"Leistungsdatum",cP:"Position ändern",iRb:"Zeile darunter einfügen",dR:"Zeile löschen",sV:"USt festlegen",cD:"Löschen?",mR:"Zeile verschieben",ctxM:"Weitere Aktionen",noteToggle:"Notiz ein-/ausblenden",sectionTitleEditTT:"Auftragsbezeichnung ändern",svcPart:"Service-Anteil",vat:"Umsatzsteuer",combP:"Positionen zusammenfassen",toSetP:"Auf Setpreis umstellen (Positionen ohne Preis)",toSetPc:"Der Set-Preis wird auf die Summe seiner Positionen gesetzt und die Positionen selbst verlieren ihren Preis. Das ist nicht rückgängig zu machen (der Betrag kann danach nur noch manuell geändert werden). Fortfahren?",toSetMc:"Jedes Set erhält die Summe seiner Positionen als Set-Preis; die Positionen des Sets werden ohne Preis dargestellt bzw. ausgeblendet. Positionen ausserhalb eines Sets bleiben unverändert einzeln aufgeführt. Das ist nicht rückgängig zu machen (die Set-Preise können danach nur noch manuell geändert werden). Fortfahren?",toSetMn:'Diese Rechnung enthält kein Set. Legen Sie zuerst über "Set-Struktur bearbeiten" ein Set an bzw. ordnen Sie Positionen einem Set zu.',iSum:"Zwischensumme",dtRel:"Freigegeben am: ",dtCr:"Erstellt am: ",rqV:"USt des Auftrags?",cthd:"wirklich aus-/einblenden ?",cst:{style:"currency",currency:"EUR"},sts:{IsWorkDone:"Arbeiten erledigt",Closed:"Auftrag geschlossen",SubcontractorPendingConfirmation:"Warten auf Bestätigung (Unterauftrag)",Scheduled:"Geplant",OfferIsRejected:"Angebot abgelehnt",OfferIsSend:"Offen (Angebot versandt)",CollaborationWaitingConfirmation:"Warten auf Bestätigung (Zusammenarbeit)",Released:"Freigegeben",OfferIsConfirmed:"Bestätigt",InProgress:"In Bearbeitung",ReadyForScheduling:"Zur Planung",Created:"Erstellt",Rejected:"Abgebrochen",Invoiced:"Rechnung gestellt","-":"-"},invHR:["Pos.","Menge","Artikelbezeichnung","VK","Summe"],frm:{invoicetitle:"Titel",invoiceaddress:"Adresse",loc:"Leistungsort / Lieferadresse",invoiceemail:"Email",invoiceemailcc:"Zusatzempfänger (CC)",provisionperiod:"Leistungsdatum / -zeitraum"},frmTT:{invoicetitle:"Rechnungstitel ändern",invoiceaddress:"Rechnungsempfänger-Adresse ändern",loc:"Leistungsort oder Lieferadresse ändern",invoiceemail:"Email-Adresse ändern und zusätzliche Email-Empfänger festlegen",provisionperiod:"Leistungsdatum oder -zeitraum ändern"}},$rcol={req:new fields_definition("Auftrag","Aufträge",[{name:"tags",label:"",type:"string",dfnc:function(e,t){""!==(e||"")&&($(this).aC("tags"),e.split(",").forEach((e=>{""!==e&&$(this).append($$.sc("tag "+e.replace(" ","_").replace("/","_").toLowerCase(),e))})))}},{name:"DateOfCreation",label:"Datum",type:"date",title:function(e){$(this).attr("title",$rct.dtCr+fdt(e.DateOfCreation).ne("-")+" \n"+$rct.dtRel+fdt(e.DateReleased).ne("-"))}},{name:"CustomerName",label:"Kunde (Firma)",type:"string"},{name:"Name",label:"Auftragsname",type:"string"},{name:"ExternalId",label:"Auftragsnummer",type:"string"},{name:"ParentExtenalId",label:"PAuftrag",type:"string"},{name:"InvoiceId",label:"RNummer",type:"string",dfnc:function(e,t){$(this).rwText(e," ").find("span").each((function(){$(this).aC("cla").click({id:$(this).text()},$inv.jdbn)}))}},{name:"State",label:"Status",type:"string"},{name:"WorkDoneAt",label:"Erledigt am",type:"date"},{name:"Description",label:"Beschreibung",type:"html"}]),itm:new fields_definition("Auftragsposition","Auftragspositionen",[{name:"NameOrNumber",label:"Bezeichnung",type:"string"},{name:"Type",label:"Typ",type:"select",required:!0,value:"Text",url:[{value:"Text",label:"Text"},{value:"Equipment",label:"Ausrüstung"},{value:"Material",label:"Material"},{value:"Service",label:"Arbeitsleistung"}],change:function(e){$req.quantChange.call(this,e)}},{name:"quantityhours",label:"Anzahl / Menge",type:"number",precision:"0.01",value:1,change:function(e){$inv.quantChange.call(this,e)}},{name:"UnitString",label:"Einheit",type:"select",url:["LFDM","Stck","Std.","QM","AW","Pauschal"],change:function(e){$inv.quantChange.call(this,e)}},{name:"net",label:"EinzelPreis netto",type:"number",precision:"0.01",value:0,change:function(e){$inv.quantChange.call(this,e)}},{name:"net_val",label:"GesamtPreis netto",type:"number",precision:"0.01",value:0},{name:"vat_val",label:"GesamtPreis USt",type:"number",precision:"0.01",value:0},{name:"svcnet_val",label:"Arbeitslohn netto",type:"number",precision:"0.01",value:0},{name:"svcvat_val",label:"Arbeitslohn USt",type:"number",precision:"0.01",value:0},{name:"net_pos",label:"Netto",type:"string"},{name:"bo_pos",label:"Brutto",type:"string"},{name:"vat",label:"USt",type:"string",value:"19,0%",change:function(e){$inv.quantChange.call(this,e)}},{name:"Note",label:"Details",type:"html",tinymce:!0}])},$ict={mdl:"Rechnungen",iov:{all:"Rechnungen (alle)","":"Rechnungen (nur fertige)","#d":"Rechnungen (nur Entwürfe)","#u":"Rechnungen (nur unbezahlt)","#r":"Rechnungen (nur angemahnt)","#a":"Rechnungen (nur Akonto)","#c":"Rechnungen (nur Storno)","#ru":"Rechnungen (nur angemahnt + unbez.)"},uba:", gesamter Zeitraum)",req:"Auftrag",inv:"Rechnung",rem:"Mahnung",in:"Rechnungsnummer",cc:"Kunde",wk:"Woche",nd:"Keine Daten gefunden.",dl:"Herunterladen",ed:"Bearbeiten",ced:"Bearbeitung fortsetzen",sItm:"Einzelheiten anzeigen",sPay:"Zahlungen anzeigen",cdI:"Entwurf der Rechnung löschen?",rel:"Neu Laden",relm:"Bitte laden Sie Liste manuell neu, um die Änderungen zu sehen.",dsp:"Rechnung anzeigen",storno:"Storno-Rechnung erstellen",credit:"Gutschrift erstellen",remd:"Mahnung erstellen",remdt:"Mahnung erstellen zur Rechnung {0}",remlst:"Mahnungen anzeigen",remdsp:"Mahnung anzeigen",remres:"Mahnung erneut senden",remresc:"Mahnung {0} wirklich erneut senden?",remresr:"Mahnung {0} wurde erfolgreich versandt.",setpyd:"Bezahlt markieren",cpyd:"Rechnung wirklich als bezahlt markieren?",setupd:"Bezahlt-Markierung aufheben",cupd:"Bezahlt-Markierung wirklich aufheben?",ivE:"Die Email-Adresse ist vermutlich nicht gültig.",ivEc:"\nMöchten Sie fortfahren?",pna:"Diese Seite ist in der Vorschau nicht verfügbar",tpe:"Die Anzahl von {0} Seiten wird aktuell nicht unterstützt",eis:"Der Rechnungsentwurf konnte nicht gespeichert werden.",pvw:"Das Dokument wird abgerufen und für die Vorschau aufbereitet.\nDer Vorgang kann bis zu 2 Minuten dauern.",pvf:"Die PDF-Vorschau konnte nicht erstellt werden.",pvto:"Der Server hat nicht rechtzeitig geantwortet (Zeitüberschreitung). Bitte versuchen Sie es erneut.",pvgone:"Der Entwurf ist auf dem Server nicht mehr vorhanden (Sitzung abgelaufen). Bitte öffnen Sie den Entwurf erneut.",iss:"Zwischenstand speichern.",p13b:"USt -> §13b",setm:"Set-Preisanzeige",setmo:{setprice:"Set mit Preis – Positionen ohne Preis",setonly:"Nur Set mit Preis – Positionen ausgeblendet"},setst:"Set-Struktur bearbeiten",setsHint:'Reihenfolge: Zeile per Drag & Drop an den oberen/unteren Rand einer anderen Zeile ziehen (davor/danach) oder ▲▼ nutzen. Zuordnung: Zeile auf die Mitte eines Sets ziehen (hinein) bzw. auf die Auftragszeile oder "oberste Ebene" (aus dem Set lösen); ◀▶ ändert die Ebene. Sets lassen sich über das Dreieck zu-/aufklappen und auch zugeklappt verschieben – ihre Positionen wandern mit. Änderungen werden sofort übernommen.',setsUp:"Nach oben (innerhalb der Ebene)",setsDown:"Nach unten (innerhalb der Ebene)",setsCollapse:"Set zuklappen",setsExpand:"Set aufklappen",setsHR:["","Pos.","Typ","Menge","Bezeichnung","Reihenfolge / Ebene"],setsRoot:"Hierher ziehen = aus dem Set lösen (oberste Ebene)",setsOut:"Eine Ebene höher (aus dem Set lösen)",setsIn:"Eine Ebene tiefer (dem vorangehenden Set zuordnen)",setsNew:"Neu:",setsInto:"in",setsTop:"oberste Ebene",setsTitle:"Bezeichnung",setsAdd:"Hinzufügen",setsNoTitle:"(ohne Bezeichnung)",settyp:{set:"Set",text:"Text",title:"Text",material:"Material",service:"Arbeitsleistung",equipment:"Ausrüstung",other:"Position",osum:"Zusammenfassung",intinvoiceallocation:"Abschlag",intinvoiceallocationdiff:"Abschlag (offen)"},ctp:"Ansprechpartner festlegen",mfr:"Von MFR neu abrufen",rq1:"Auftragsdaten werden von MFR abgerufen.\nDer Vorgang kann bis zu 90Sek dauern.",rq2:"Auftragsdaten werden geladen",iq1:"Rechnungsdaten werden von MFR abgerufen.\nDer Vorgang kann bis zu 90Sek dauern.",iq2:"Rechnungsdaten werden geladen",sis:"Rechnung als versandt markieren",srs:"Mahnung als versandt markieren",sisc:"Rechnung wirklich als versandt markieren?",srsc:"Mahnung wirklich als versandt markieren?",iSt:{dft:"Entwurf",uns:"nicht versandt",pyd:"bezahlt",cc:"storniert",op:"offen",due:"fällig",ovd:"überfällig",rem:"angemahnt"},rSt:["","Überfällig","2. Mahnung","3. Stufe"],pSt:{a:"Vollst.",p:"Teilz."},ivT:{i:"AbschlagsR.",f:"SchlussR",r:"Rechnung",c:"StornoR."},rovlh:"Übersicht der bisherigen Mahnungen",rovl:["Betreff","Betrag","Betrag gezahlt","fertiggestellt am"],remHR:["Rechnung","vom","Rechnungsbetrag","bereits bezahlt","noch offen"],translatePaymentTerm:e=>(e||"").replace("wd"," Werktagen").replace("d"," Tagen").replace("wk"," Wochen")||"10 Tagen",payi:{account:"Konto",name:"Zahler",text:"Verw.Zweck",InvoiceID:"Rechnung",amount:"Betrag",date:"Datum",manual:"Typ"}},$invcol={datev:new fields_definition("Rechnung","Rechnungen",[{name:"Umsatz (ohne Soll/Haben-Kz)",label:"Umsatz (ohne Soll/Haben-Kz)",type:"string"},{name:"vf",label:"vf",type:"string"},{name:"Soll/Haben-Kennzeichen",label:"Soll/Haben-Kennzeichen",type:"string"},{name:"Konto",label:"Konto",type:"string"},{name:"Gegenkonto",label:"Gegenkonto",type:"string"},{name:"BU-Schlüssel",label:"BU-Schlüssel",type:"string"},{name:"Belegdatum",label:"Belegdatum",type:"string"},{name:"Belegfeld 1",label:"Belegfeld 1",type:"string"},{name:"Belegfeld 2",label:"Belegfeld 2",type:"string"},{name:"Buchungstext",label:"Buchungstext",type:"string"}]),inv:new fields_definition("Rechnung","Rechnungen",[{name:"invstatus",label:"Status",type:"select",url:$ict.iSt},{name:"balance",label:"Umsatz",type:"string",dtype:"currency"},{name:"CustomerName",label:"Kunde",type:"string"},{name:"InvoiceId",label:"RNummer",type:"string"},{name:"InvoiceType",label:"Typ",type:"select",url:$ict.ivT},{name:"request",label:"Auftrag",type:"string",dtype:"num"},{name:"vat",label:"MwSt",type:"string",dtype:"num"},{name:"deb_cred",label:"Soll/Haben",type:"string"},{name:"customer",label:"Konto",type:"string",dtype:"num"},{name:"contra_account",label:"Gegenkonto",type:"string",dtype:"num"},{name:"Belegdatum",label:"Belegdatum",type:"date"},{name:"reminderstatus",label:"MahnStatus",type:"select",url:$ict.rSt},{name:"reminder",label:"# Mahnungen",type:"integer"},{name:"Buchungstext",label:"Buchungstext",type:"string"},{name:"Payment",label:"Zahlung",type:"string"}]),rem:new fields_definition("Zahlungserinnerung","Zahlungserinnerung",[{name:"amount",label:"Rechnungsbetrag",type:"number",precision:"0.01",value:1},{name:"amount_payed",label:"bereits bezahlt",type:"number",precision:"0.01",value:1}]),rem2:new fields_definition("Zahlungserinnerung","Zahlungserinnerung",[{name:"DocumentName",label:"Name",type:"string"},{name:"subject",label:"Betreff",type:"string"},{name:"DateSent",label:"Versanddatum",type:"date"},{name:"status",label:"Status",type:"string"},{name:"amount_open",label:"offener Betrag",type:"number",precision:"0.01"},{name:"InvoiceId",label:"RNummer",type:"string"}]),rid:new fields_definition("Zahlungserinnerung","Zahlungserinnerung",[{name:"type",label:"Typ",type:"select",url:[["f","einfache Zahlungserinnerung"],["m","Mahnung"],["l","letzte Mahnung"]],required:!0},{name:"level",label:"Stufe",type:"select",url:[["1","Stufe 1"],["2","Stufe 2"],["3","Stufe 3"],["4","Stufe 4"],["5","Stufe 5"],["6","Stufe 6"]],required:!0}]),ctp:new fields_definition("Ansprechpartner","Ansprechpartner",[{name:"name",label:"Name",type:"string"},{name:"email",label:"Email",type:"string"}])},gi=(e,t)=>$$.sc("glyphicon glyphicon-"+e).aC(t),$inv={init2:function(e,t){e=e||"inv",t=t||{},$ocms.getScript([],(function(){$inv.init3(e,t)}))},init3:async function(e,t){$fis.cf(!0);let n=$fis.lf(!0);$("#topbar").ocmsmenu([]),$("#activemodule").text($ict.mdl);let i=[(async()=>{await $fis.getAuth("fds_inv")>0&&($inv.prepLst(""),n.aC("fix"))})(),new Promise(((e,t)=>{$fis.prepAuth(["fds_reminder"])}))];await Promise.all(i)},prepLst:function(e){let t=new Date,n=$fis.lf(!0).ldng(1),i=new Date("2021-01-01");$fis.frm_list().IN((function(){}));let a=[];$.each($ict.iov,((e,t)=>{a.push({lbl:t,fnc:()=>{$inv.prepLst(e),n.aC("fix")}})})),$fis.lfm().ocmsmenu([{lbl:"Filter",itm:a}]);$$.i({placeholder:$ict.in}).appendTo($$.dc("mth ivn",n)).enterKey((function(e){let t=$(this),n=t.val()||"";e.stopPropagation(),t.parent().siblings().rC("selected"),n.length>3&&(t.parent().aC("selected"),$inv.renderinv("i:"+n,"s","all"),t.val(""))})),$$.i({placeholder:$ict.cc}).appendTo($$.dc("mth ivc",n)).enterKey((function(e){let t=$(this),n=t.val()||"";e.stopPropagation(),t.parent().siblings().rC("selected"),n.length>=3&&(t.parent().aC("selected"),$inv.renderinv("c:"+n,"s","all"),t.val(""))}));"#"===e.substr(0,1)&&$$.dc("mth extra",n).text($ict.iov[e].replace(")",$ict.uba)).click((function(t){let n=$(this);if(t.stopPropagation(),n.siblings().rC("selected"),!0===n.is(".selected")){n.toggleClass("selected");let t=fdt(new Date,"yy-MM-dd");$inv.renderinv(t,"a",e)}n.aC("selected")})),n.append("
");let r=$$.dc("mthl",n),l=t.getFullYear(),s=t.getMonth()+1;for(let t=i.getFullYear();t<=l;t++){let n=$$.dc("yr").prependTo(r).text($ict.iov[e]+" - "+t.toString()).toggleClass("selected",t===l);n.click({yr:t},(function(e){e.stopPropagation(),n.siblings().rC("selected"),n.aC("selected")}));let a=$$.dc("mfrm",n);for(let n=0;n<(t!==l?12:s);n++){i=new Date(t,n,1);let r=$$.dc("mth").prependTo(a).text($ict.iov[e]+" - "+fdt(i,"MMM yyyy"));if(r.click({yr:t,mt:n},(function(t){if(t.stopPropagation(),r.siblings().rC("selected"),!0===r.is(".selected")){r.toggleClass("selected");let n=fdt(new Date(t.data.yr,t.data.mt,1),"yy-MM-dd");$inv.renderinv(n,"m",e)}r.aC("selected")})),""===e){$$.dc("mthdl",r).append(gi("compressed","ico")).click({yr:t,mt:n},(function(e){e.stopPropagation();let t=fdt(new Date(e.data.yr,e.data.mt,1),"yy-MM-dd");$inv.downloadzip(t,"m")}))}let l=getMonday(i),s=new Date(i);s.setMonth(s.getMonth()+1),s.setDate(0),s=getMonday(s);let d=$$.dc("wfrm",r);for(;l<=s;){let t=$$.dc("wk",d).text(($ict.wk||"W")+" "+fdt(l,"dd.MM.yy"));t.click({rd:new Date(l)},(function(n){n.stopPropagation();let i=fdt(n.data.rd,"yy-MM-dd");$inv.renderinv(i,"w",e),r.siblings().rC("selected").find(".wk").rC("selected"),r.aC("selected").find(".wk").rC("selected"),t.aC("selected")})),$$.dc("wkdl",t).append(gi("compressed","ico")).click({rd:new Date(l)},(function(e){e.stopPropagation();let t=fdt(e.data.rd,"yy-MM-dd");$inv.downloadzip(t,"w")})),l.setDate(l.getDate()+7)}}}n.ldng(0)},rerenderinv:function(){let e=$("#contentframe .invfrm:first");if(e.length>0){let t=e.data("sets")||{};t.mode&&$inv.renderinv(t.tgt,t.mode,t.includes)}},renderinv:function(e,t,n){let i=$fis.frm_list(!0,!0).ldng(1),a=$$.dc("invfrm",i).aC("md"+t).data("sets",$.extend({},{tgt:e,mode:t,includes:n})),r=$fis.lf();$ocms.postXT({url:$ocms.url("inv/invl"),data:{mode:t,tgt:e,includes:n},success:i=>{r.rC("fix").aC("hd"),$$.dc("ovhd",a).text(i.admin.title);let l=$$.tblset({},a),s=$invcol.inv,d=$$.tr(l.hd);$$.th(d);$.each(s.fields||[],((e,t)=>{$$.th(d).text(t.label),"vat"===t.name&&$$.th(d)})),$.each(i.invoices||[],((d,c)=>{let o=$$.tr(l.bdy);o.click((function(){r.rC("fix").aC("hd"),o.toggleClass("selected").siblings().rC("selected").find("td.av").rC("av"),o.find("td.av").rC("av"),!0===o.is(".selected")?$inv.iMn(c):$inv.eM()}));let u=$$.td(o,{class:"raux"});c.hasFile?($$.dc("idl ilbtn",u,{title:$ict.dl+"\n"+c.DocumentName}).append(gi("save-file","ico")).click({id:c.Id},$inv.downloadinv),$$.dc("idl ilbtn",u,{title:$ict.dsp+"\n"+c.DocumentName}).append(gi("eye-open","ico")).click({id:c.Id,typ:"inv"},$inv.jdisp)):!1===c.isFinal&&!0===$fis.isAuth("fds_inv",2)&&$$.dc("idl ilbtn",u,{title:$ict.ed}).append(gi("edit","ico")).click({id:c.Id},$inv.doContInv),$$.dc("iitm ilbtn",u,{title:$ict.sItm}).append(gi("list","ico")).click({id:c.Id},$inv.showitm),$$.dc("iitm ilbtn",u,{title:$ict.sPay}).append(gi("euro","ico")).click({id:c.Id},$inv.showpay),$.each(s.fields||[],((r,l)=>{let s,d,u=$$.td(o).aC(l.dtype);switch("select"===(l.type||"")?u.text((l.url||{})[c[l.name]]||""):u.text(c[l.name]),l.name||""){case"vat":s=$$.sel().appendTo($$.td(o,{class:"vsel"})),d=(i.admin.ust_options||"19,0%;16,0%;0,0%").split(";"),$.each(d,((e,t)=>{$$.opt(t,t).appendTo(s)})),s.click((function(e){e.stopPropagation()})).val(c[l.name]).change().change({frm:a,tgt:e,mode:t,id:c.Id,td:u,includes:n},$inv.setvat),u.toggleClass("hl",c[l.name].substr(0,2)!==d[0].substr(0,2)).click((function(e){e.stopPropagation(),$(this).toggleClass("av")}));break;case"balance":u.aC("sh_"+(c.SollHaben||"").toLowerCase());break;case"invstatus":case"reminderstatus":u.aC(("invstatus"===l.name?"is_":"rs_")+c[l.name])}}))}))},complete:()=>{i.ldng(0)}})},setvat:function(e){let t=$(this),n=e.data||{};$ocms.postXT({url:$ocms.url("inv/setvat"),data:{id:n.id,val:t.val()},success:e=>{n.td.rC("av"),$inv.renderinv(n.tgt,n.mode,n.includes)}})},downloadzip:function(e,t){$(this).empty();window.open($ocms.url("inv/datevzip?mode="+t+"&tgt="+encodeURIComponent(e)),"_blank")},showitm:function(e){let t=$(this).closest("tr");e.stopPropagation(),!1!==t.is(".selected")&&$ocms.postXT({url:$ocms.url("inv/rqi"),data:{id:e.data.id},success:e=>{let t=$$.dc("rfrm");(e.requests||[]).length<1?t.text($ict.nd):$.each(e.requests||[],(function(e,n){let i=$$.dc("srq",t);$$.dc("nme",i).text(n.name);let a=$$.tblset({class:"if"},i);$.each(n.items||[],((e,t)=>{let n=$$.tr({id:"itm"+t.Id}).appendTo(a.bdy);$$.td(n).text(t.NameOrNumber),$$.td(n).text(t.Type),$$.td(n).aC("currency").text(t.net_pos),$$.td(n).aC("currency").text(t.bo_pos),$$.td(n).aC("num").text(t.vat)}))})),$ocms.dlg(t,{width:1e3})}})},showpay:function(e){let t=$(this).closest("tr");e.stopPropagation(),!1!==t.is(".selected")&&$ocms.postXT({url:$ocms.url("inv/pyi"),data:{id:e.data.id},success:e=>{let t=$$.dc("rfrm");if((e.payments||[]).length<1)t.text($ict.nd);else{let n=$$.tblset({class:"if"},t),i=$$.tr(n.hd);$.each(["date","account","name","text","InvoiceID","amount","manual"],((e,t)=>{$$.th(i,$ict.payi[t])})),$.each(e.payments,((e,t)=>{let i=$$.tr({id:"itm"+t.banking_uid}).appendTo(n.bdy);$$.td(i).aC("date").text(t.date),$$.td(i).text(t.account),$$.td(i).text(t.name),$$.td(i).text(t.text),$$.td(i).text(t.InvoiceID),$$.td(i).aC("currency").text(t.amount),$$.td(i).text(t.manual)}))}$ocms.dlg(t,{width:1e3,title:"Übersicht der Zahlungen"})}})},downloadinv:function(e){let t=$(this).closest("tr");e.stopPropagation(),!1!==t.is(".selected")&&window.open($ocms.url("inv/rdoc?id="+e.data.id),"_blank")},doContInv:function(e){let t=$(this).closest("tr");e.stopPropagation(),!1!==t.is(".selected")&&$inv.cntInv({id:e.data.id})}},$$inv={init2:$inv.init2,auth:{}};export default $$inv;$inv.cInv=function(e){let t=$(this).closest("tr");e.stopPropagation(),!1!==t.is(".selected")&&!1!==$fis.isAuth("fds_inv",2)&&$inv.cInv2({id:e.data.id})},$inv.rMn=e=>{let t=[{lbl:$ict.req,itm:[]}];return!0===bool(e,!1)&&!0===$fis.isAuth("fds_inv",2)&&Array.prototype.push.apply(t[0].itm,[{lbl:$rct.crI,fnc:$inv.ccInv,data:{typ:"r"}},{lbl:$rct.crII,fnc:$inv.ccInv,data:{typ:"i"}}]),t.push({lbl:$ict.rel,fnc:$inv.rReload}),$("#topbar").ocmsmenu(t)},$inv.iMnr=e=>{let t=booln(e.isFinal,!0),n=e.Id,i=booln(e.fds,!1),a=[{glyph:"glyphicon-menu-left",fnc:()=>{$fis.frm_edit().remove()}},{lbl:$ict.inv,itm:[]},{lbl:$ict.rem,itm:[]}];return!1===t&&!0===$fis.isAuth("fds_inv",2)?a[1].itm.push({lbl:$ict.ced,fnc:$inv.clCntInv}):!0===$fis.isAuth("fds_inv",1)&&a[1].itm.push({lbl:$ict.dsp,fnc:()=>$inv.disp(n,"inv")}),!0===i&&!0===t&&!0===$fis.isAuth("fds_inv",2)&&(a[1].itm.push({lbl:$ict.storno,fnc:()=>$inv.storno(n,i)}),a[1].itm.push({lbl:$ict.credit,fnc:()=>$inv.credit(n,i)})),!0===t&&!0===$fis.isAuth("fds_reminder",2)&&(a[2].itm.push({lbl:$ict.remd,fnc:()=>$inv.ccRem(n,e.InvoiceId)}),a[2].itm.push({lbl:$ict.remlst,fnc:()=>$inv.dspRem(n)})),!0===t&&!0===$fis.isAuth("fds_reminder",2)&&!1===booln(e.IsSent,!1)&&a[2].itm.push({lbl:$ict.srs,fnc:()=>$inv.srs(n)}),a.push({lbl:$ict.rel,fnc:$inv.rReload}),$("#topbar").ocmsmenu(a)},$inv.iMn=e=>{let t=booln(e.isFinal,!0),n=e.Id,i=booln(e.fds,!1),a=[{glyph:"glyphicon-menu-left",fnc:()=>{$fis.frm_edit().remove()}},{lbl:$ict.inv,itm:[]},{lbl:$ict.rem,itm:[]}];return!1===t&&!0===$fis.isAuth("fds_inv",2)?a[1].itm.push({lbl:$ict.ced,fnc:()=>{$inv.cntInv({id:n})}}):!0===$fis.isAuth("fds_inv",1)&&a[1].itm.push({lbl:$ict.dsp,fnc:()=>$inv.disp(n,"inv")}),!0===$fis.isAuth("fds_inv",2)&&(a[1].itm.push({lbl:$ict.storno,fnc:()=>$inv.storno(n,i)}),a[1].itm.push({lbl:$ict.credit,fnc:()=>$inv.credit(n,i)})),!0===t&&!1===booln(e.IsPayed,!1)?(!0===$fis.isAuth("fds_reminder",2)&&a[2].itm.push({lbl:$ict.remd,fnc:()=>$inv.ccRem(n,e.InvoiceId)}),!0===$fis.isAuth("fds_inv",2)&&a[1].itm.push({lbl:$ict.setpyd,fnc:()=>$inv.setPyd(n)})):!0===t&&!0===booln(e.IsPayed,!1)&&"m"===(e.PaymentStatus||"")&&!0===$fis.isAuth("fds_inv",2)&&a[1].itm.push({lbl:$ict.setupd,fnc:()=>$inv.setUpd(n)}),!0===$fis.isAuth("fds_reminder",2)&&a[2].itm.push({lbl:$ict.remlst,fnc:()=>$inv.dspRem(n)}),!0===t&&!0===$fis.isAuth("fds_inv",2)&&!1===booln(e.IsSent,!1)&&a[1].itm.push({lbl:$ict.sis,fnc:()=>$inv.sis(n)}),!1===i&&a[1].itm.push({lbl:$ict.mfr,fnc:()=>$inv.mfrrel(n)}),$("#topbar").ocmsmenu(a)},$inv.emOpt=()=>"iss,p13b,ctp,setst,setm",$inv.eM=(e,t,n)=>{let i=[];return!0!==booln(e,!1)&&!0!==booln(t,!1)||i.push({glyph:"glyphicon-menu-left",fnc:()=>{$fis.lf(!0),$fis.frm_edit().remove()}}),!0===(n||"").split(",").includes("iss")&&i.push({lbl:$ict.iss,fnc:$inv.ssave}),!0===(n||"").split(",").includes("ctp")&&i.push({lbl:$ict.ctp,fnc:$inv.sctp}),!0===(n||"").split(",").includes("p13b")&&i.push({lbl:$ict.p13b,fnc:$inv.sp13b}),!0===(n||"").split(",").includes("setm")&&i.push({lbl:$ict.setm,fnc:$inv.ssetmode}),!0===(n||"").split(",").includes("setst")&&i.push({lbl:$ict.setst,fnc:()=>$inv.sets.open()}),!0===(n||"").split(",").includes("iss")&&(i.push({lbl:"Änderungshistorie",fnc:()=>$inv.d.history()}),i.push({lbl:"Änderungen verwerfen",fnc:()=>$inv.d.discard()})),!0===booln(e,!1)&&i.push({lbl:$ict.rel,fnc:$inv.rReload}),$("#topbar").ocmsmenu(i)},$inv.pdfPreviewTimeout=12e4,$inv.pdfPreviewFailed=function(e,t){if(11110===(e||{}).internalCode)return void $ocms.login.dlg();let n=((e||{}).internalText||"").trim();""===n&&"timeout"===t&&(n=$ict.pvto),""===n&&410===(e||{}).status&&(n=$ict.pvgone),alert(($ict.pvf||$t.f1)+(""!==n?"\n"+n:""))},$inv.pdfPreviewComplete=function(e,t){return(n,i)=>{t&&t.c.trigger("modal_close"),e&&e.rC("freeze"),"timeout"===i&&$inv.pdfPreviewFailed(n,i)}},$inv.pdfWaitDlg=function(){let e=$ocms.dlg($$.dc("rfrm").ldng(1),{exclusive:!1,zindex_min:50});return e&&e.ft.rwText($ict.pvw),e},$inv.d={tbl:()=>$("div.invoice_layout table.invi"),layout:()=>$("div.invoice_layout"),token:function(){return $inv.d.tbl().data("dtoken")||""},hashes:function(){let e=$inv.d.tbl().data("bai")||[],t={};return $.each(e,((e,n)=>{t[(n.Id||"").toString()]=JSON.stringify(n)})),t},seed:function(e){let t=$inv.d.layout();t.aC("freeze");let n=$ocms.postXT({url:$ocms.url("inv/dopen"),data:{payload:JSON.stringify(e)},success:e=>{$inv.d.tbl().data("dtoken",e.token).data("dver",e.version).data("dhashes",$inv.d.hashes()).data("dorder",$inv.d.order()),$fis.draft.bind(e.token,{onReady:()=>$inv.d.refresh(),onExpiring:e=>$inv.d.warnExpiry(e),onClosed:e=>$inv.d.closed(e)}),$inv.d.refresh()},error:()=>{t.rC("freeze")},complete:()=>{$inv.d.tbl().removeData("dseeding").removeData("dseedpromise")}});return $inv.d.tbl().data("dseedpromise",n),n},refresh:function(e){let t=$inv.d.token();""!==t&&$ocms.postXT({url:$ocms.url("inv/dstate"),data:{token:t},success:t=>{$inv.d.applyState(t),"function"==typeof e&&e(t)},error:e=>{e&&410===e.status&&$inv.d.closed("expired")},complete:()=>{$inv.d.layout().rC("freeze")}})},applyState:function(e){let t=$inv.d.tbl();if(t.length<1)return;let n=t.data("dver");"number"==typeof n&&"number"==typeof e.version&&e.version$$.dc("dnote").aC(e.style||"InvoiceNotes").text(e.text)))},applyItems:function(e,t){let n=e=>void 0===e?null:e;(t||[]).forEach((t=>{if(!t)return;let i=(t.Id||"").toString();if(""===i)return;let a=e.children("tbody").filter(((e,t)=>(($(t).data()||{}).Id||"").toString()===i)).first();if(a.length<1)return;let r=t.itm||[],l={},s=a.find("tr.title").first(),d=s.length?s:null;r.forEach((e=>{let t=(e.id||"").toString();if(""===t)return;l[t]=!0;let i=a.find("#itm"+t).first(),r=i.length<1;r&&(i=$$.tr(a,{id:"itm"+t,class:"itm"}));let s=i.data()||{},c=r||(s.Type||"")!==(e.typ||"")||s.net!==n(e.v)||s.net_val!==n(e.vt)||s.vat_val!==n(e.vv)||s.svcnet_val!==n(e.vs)||s.svcvat_val!==n(e.vsv)||(s.position||"")!==(null!=e.p?e.p:"")||(s.lvl||0)!==(e.lvl||0)||(s.SetItmId||null)!==(null!=e.SetItmId?e.SetItmId:null);$.extend(s,{Id:t,Type:e.typ,net:n(e.v),net_val:n(e.vt),vat_val:n(e.vv),svcnet_val:n(e.vs),svcvat_val:n(e.vsv),vat:e.vat,position:null!=e.p?e.p:"",SetItmId:null!=e.SetItmId?e.SetItmId:null,lvl:e.lvl||0}),r&&$.extend(s,{htmltext:e.t,quantity:e.q}),i.data(s),d?i.prev()[0]!==d[0]&&i.insertAfter(d):a.children().first()[0]!==i[0]&&a.prepend(i),d=i,c&&$inv.rrw.call(i)})),a.find("tr.itm").each(((e,t)=>{let n=(($(t).data()||{}).Id||"").toString();""===n||l[n]||$(t).remove()}))}))},applySetDisplay:function(e,t){e.find("tr.itm").each(((e,n)=>{let i=$(n),a=((i.data()||{}).Id||"").toString();if(""===a||!Object.prototype.hasOwnProperty.call(t,a))return;let r=t[a]||{};i.tC("sethdr",bool(r.h,!1)),!1===bool(r.p,!0)&&i.find("td.currency").text("")}))},sync:function(e){let t=$inv.d.token();if(""===t){let t=$inv.d.tbl().data("dseedpromise");return t?$.when(t).then((()=>$inv.d.sync(e))):$.when()}return $inv.d.layout().aC("freeze"),$ocms.postXT({url:$ocms.url("inv/dpatch"),data:{token:t,delta:JSON.stringify(e)},success:()=>{$inv.d.refresh()},error:e=>{$inv.d.layout().rC("freeze"),e&&410===e.status&&$inv.d.closed("expired")}})},order:function(){return($inv.d.tbl().data("bai")||[]).map((e=>(e.Id||"").toString()))},syncChanged:function(e){let t=e.data("bai")||[],n=e.data("dhashes")||{},i={},a=[],r=[],l=[];$.each(t,((e,t)=>{let r=(t.Id||"").toString(),l=JSON.stringify(t);i[r]=l,n[r]!==l&&a.push(t)})),$.each(n,(e=>{void 0===i[e]&&r.push(e)}));let s=$inv.d.order(),d=e.data("dorder")||[];return e.data("dhashes",i).data("dorder",s),a.forEach((e=>l.push($inv.d.sync({Target:"block.replace",Ref:(e.Id||"").toString(),Value:e})))),r.forEach((e=>l.push($inv.d.sync({Target:"block.remove",Ref:e})))),d.length===s.length&&d.slice().sort().join(",")===s.slice().sort().join(",")&&d.join(",")!==s.join(",")&&l.push($inv.d.sync({Target:"block.order",Value:s})),$.when.apply($,l).promise()},syncField:function(e,t){let n={invoicetitle:"title",invoiceaddress:"address",invoiceemail:"email",invoiceemailcc:"emailcc",loc:"provisionlocation",provisionlocation:"provisionlocation",provisionperiod:"provisionperiod"}[e];n&&$inv.d.sync({Target:n,Value:t})},footer:function(e,t,n){let i=e.children("tfoot").empty();e.nextAll(".fnote").remove();let a=bool(n.p13b,!1),r=(e,t,n)=>$$.tdc("currency",$$.tr(i,{class:n||"tsum"}).append([$$.tdc("aux"),$$.td({colspan:4}).text(e)]),fnum(t,$rct.cst)),l=t=>$$.dc("fnote").insertAfter(e).rwText(t);r("Netto",t.total_net||0),!1===a&&$.each(t.vat||{},((e,t)=>r($rct.vat+" "+e+"%",t,"tvat"))),r("Summe",t.total_gross||0);let s=n.type||"";"i"===s?(l($rct.note2),l($rct.note4)):"c"===s?l($rct.note2):(l(string($rct.note3,[fnum(((t.service_net||0)+(t.service_vat||0))*(n.tax_servicerefund||0),$rct.cst)])).aC("ntax"),l($rct.note2),l(string($rct.note1,[fnum((t.service_net||0)+(t.service_vat||0),$rct.cst),fnum(t.service_net||0,$rct.cst),fnum(t.service_vat||0,$rct.cst)]))),!0===a&&l($rct.note13b)},validation:function(e){let t=$("div.invoice_layout");if(t.length<1)return;let n=t.children(".dvalidation");n.length<1&&(n=$$.dc("dvalidation"),t.prepend(n)),n.empty().tC("hidden",(e||[]).length<1),$.each(e||[],((e,t)=>$$.dc("dvmsg",n).aC(t.severity).text(t.message)))},preview:function(){let e=$inv.d.token();if(""===e)return;let t=$inv.d.layout(),n=($inv.d.tbl().data("new")||{}).invoiceemail||"";!1===$fis.ValidateEmail(n)&&!1===bool(confirm($ict.ivE+$ict.ivEc),!1)||(t.aC("freeze"),$ocms.postXT({url:$ocms.url("inv/dpreview"),data:{token:e},timeout:$inv.pdfPreviewTimeout,success:n=>{t.rC("freeze");let i=$$.dc("imagecollection pdfpreview"),a=Math.round(.88*vh()),r=n.total;r>10&&$$.dc("note warn",i).text($ict.tpe),$.each(n.img||[],((e,t)=>{$$.dc("pdfp",i).append($$.img(t).css("max-height",(a-rpx(6)).toString()+"px"))}));for(let e=(n.img||[]).length+1;e<=r;e++)$$.dc("pdfp ph",i).append($$.dc("note",$ict.pna));$ocms.dlg(i,{size:[a,Math.round(.88*vw())],zindex:50,form:!1,button:$rct.crI,confirm:function(n){let i=$(this);t.aC("freeze"),$ocms.postXT({url:$ocms.url("inv/dsave"),data:{token:e},success:e=>{$ocms.postXT({url:$ocms.url("req/sconf"),data:{id:e.invid},success:t=>{i.trigger("modal_close"),!0===t.hasFile&&window.open($ocms.url("req/idoc")+"?id="+e.invid,"_blank"),$inv.d.close(),$ocms.init("req"),$inv.rReload()},error:()=>{alert($t.f1),i.trigger("modal_close")},complete:()=>{t.rC("freeze")}})},error:()=>{t.rC("freeze"),alert($ict.eis)}})},cancel:function(e){confirm($ict.cdI)&&($inv.d.close(),$inv.rReload())}})},error:$inv.pdfPreviewFailed,complete:$inv.pdfPreviewComplete(t)}))},save:function(){let e=$inv.d.token();if(""===e)return;let t=$inv.d.layout();t.aC("freeze"),$ocms.postXT({url:$ocms.url("inv/dsave"),data:{token:e},success:e=>{$inv.d.tbl().data("invid",e.invid)},error:()=>{alert($ict.eis)},complete:()=>{t.rC("freeze")}})},history:function(){let e=$inv.d.token();""!==e&&$ocms.postXT({url:$ocms.url("inv/dhistory"),data:{token:e},success:e=>{let t=$$.dc("dhist");if((e.history||[]).length<1)$$.dc("note",t).text("Noch keine Änderungen erfasst.");else{let n=$$.tblset({class:"invtbl fullwidth"},t);$$.tr(n.hd).append([$$.th().text("Zeit"),$$.th().text("Feld"),$$.th().text("Alt"),$$.th().text("Neu")]),$.each(e.history,((e,t)=>$$.tr(n.bdy).append([$$.tdc("keep",fdt(t.timestamp)),$$.td().text(t.target),$$.td().text(t.oldValue),$$.td().text(t.newValue)])))}$ocms.dlg(t,{width:800,form:!1})}})},discard:function(){let e=$inv.d.tbl().data("invid")||"";""!==e?!1!==confirm("Alle Änderungen verwerfen und den zuletzt gespeicherten Stand neu laden?")&&($inv.d.close(),$inv.cntInv({id:e})):alert("Es wurde noch kein Zwischenstand gespeichert, der wiederhergestellt werden könnte.")},warnExpiry:function(e){let t=Math.max(1,Math.round((e||0)/60));$fis.notifications.push({severity:"info",title:"Entwurf läuft ab",message:"Der Rechnungsentwurf läuft in etwa "+t+" Minute(n) ab. Bitte zwischenspeichern, sonst gehen die Änderungen verloren."})},closed:function(e){let t=$inv.d.token();$inv.d.tbl().removeData("dtoken"),""!==t&&$fis.draft.release(t),$fis.frm_edit().remove(),$fis.lf(!0),$fis.notifications.push({severity:"error",title:"Entwurf geschlossen",message:"expired"===e?"Der Rechnungsentwurf ist wegen Inaktivität abgelaufen. Nicht gespeicherte Änderungen sind verloren.":"Der Rechnungsentwurf wurde geschlossen."});try{$inv.rReload()}catch(e){}},close:function(){let e=$inv.d.token();""!==e&&($ocms.postXT({url:$ocms.url("inv/dclose"),data:{token:e}}),$fis.draft.release(e)),$inv.d.tbl().removeData("dtoken")}},$inv.rd={tbl:()=>$("div.invoice_layout table.invi"),layout:()=>$("div.invoice_layout"),token:function(){return $inv.rd.tbl().data("rdtoken")||""},seed:function(e){let t=$inv.rd.layout();t.aC("freeze"),$ocms.postXT({url:$ocms.url("rem/dopen"),data:{payload:JSON.stringify(e)},success:e=>{$inv.rd.tbl().data("rdtoken",e.token).data("rdver",e.version),$fis.draft.bind(e.token,{onReady:()=>$inv.rd.refresh(),onExpiring:e=>$inv.rd.warnExpiry(e),onClosed:e=>$inv.rd.closed(e)}),$inv.rd.refresh()},error:()=>{t.rC("freeze")}})},refresh:function(e){let t=$inv.rd.token();""!==t&&$ocms.postXT({url:$ocms.url("rem/dstate"),data:{token:t},success:t=>{$inv.rd.applyState(t),"function"==typeof e&&e(t)},error:e=>{e&&410===e.status&&$inv.rd.closed("expired")},complete:()=>{$inv.rd.layout().rC("freeze")}})},applyState:function(e){let t=$inv.rd.tbl();if(t.length<1)return;let n=t.data("rdver");"number"==typeof n&&"number"==typeof e.version&&e.version{let t=$$[0]("p").aC("dnote intro").rwText(e);a.length?t.insertBefore(a):t.appendTo(n)})),((e||{}).closing||[]).forEach((e=>$$[0]("p").aC("dnote closing").rwText(e).appendTo(n)))},sync:function(e){let t=$inv.rd.token();""!==t&&($inv.rd.layout().aC("freeze"),$ocms.postXT({url:$ocms.url("rem/dpatch"),data:{token:t,delta:JSON.stringify(e)},success:()=>{$inv.rd.refresh()},error:e=>{$inv.rd.layout().rC("freeze"),e&&410===e.status&&$inv.rd.closed("expired")}}))},syncField:function(e,t){if(""===$inv.rd.token())return;let n={subject:"subject",invoiceaddress:"address",invoiceemail:"email",text:"text"}[e];n&&$inv.rd.sync({Target:n,Value:t})},syncAmount:function(e,t){""!==$inv.rd.token()&&($inv.rd.sync({Target:"amount",Value:(null!=e?e:0).toString()}),$inv.rd.sync({Target:"amount_payed",Value:(null!=t?t:0).toString()}))},footer:function(e,t){let n=e.children("tfoot").empty(),i=$$.tr(n,{class:"tsum"}).append([$$.tdc("aux"),$$.td({colspan:4}).text("Offener Betrag")]);$$.tdc("currency",i,fnum(t.amount_open||0,$rct.cst))},validation:function(e){let t=$inv.rd.layout();if(t.length<1)return;let n=t.children(".dvalidation");n.length<1&&(n=$$.dc("dvalidation"),t.prepend(n)),n.empty().tC("hidden",(e||[]).length<1),$.each(e||[],((e,t)=>$$.dc("dvmsg",n).aC(t.severity).text(t.message)))},preview:function(){let e=$inv.rd.token();if(""===e)return;let t=$inv.rd.layout(),n=($inv.rd.tbl().data("new")||{}).invoiceemail||"";!1===$fis.ValidateEmail(n)&&!1===bool(confirm($ict.ivE+$ict.ivEc),!1)||(t.aC("freeze"),$ocms.postXT({url:$ocms.url("rem/dpreview"),data:{token:e},timeout:$inv.pdfPreviewTimeout,success:n=>{t.rC("freeze");let i=$$.dc("imagecollection pdfpreview"),a=Math.round(.88*vh());$.each(n.img||[],((e,t)=>{$$.dc("pdfp",i).append($$.img(t).css("max-height",(a-rpx(6)).toString()+"px"))})),$ocms.dlg(i,{size:[a,Math.round(.88*vw())],zindex:50,form:!1,button:$ict.remd,confirm:function(n){let i=$(this);t.aC("freeze"),$ocms.postXT({url:$ocms.url("rem/dsave"),data:{token:e},success:e=>{$ocms.postXT({url:$ocms.url("rem/conf"),data:{id:e.remid},success:()=>{i.trigger("modal_close"),window.open($ocms.url("rem/idoc")+"?id="+e.remid,"_blank"),$inv.rd.close(),$ocms.init("req"),$inv.rReload()},error:()=>{alert($t.f1),i.trigger("modal_close")},complete:()=>{t.rC("freeze")}})},error:()=>{t.rC("freeze"),alert($t.f1)}})},cancel:function(e){confirm($ict.cdI)&&($inv.rd.close(),$inv.rReload())}})},error:$inv.pdfPreviewFailed,complete:$inv.pdfPreviewComplete(t)}))},save:function(){let e=$inv.rd.token();if(""===e)return;let t=$inv.rd.layout();t.aC("freeze"),$ocms.postXT({url:$ocms.url("rem/dsave"),data:{token:e},success:e=>{$inv.rd.tbl().data("remid",e.remid)},error:()=>{alert($t.f1)},complete:()=>{t.rC("freeze")}})},history:function(){let e=$inv.rd.token();""!==e&&$ocms.postXT({url:$ocms.url("rem/dhistory"),data:{token:e},success:e=>{let t=$$.dc("dhist");if((e.history||[]).length<1)$$.dc("note",t).text("Noch keine Änderungen erfasst.");else{let n=$$.tblset({class:"invtbl fullwidth"},t);$$.tr(n.hd).append([$$.th().text("Zeit"),$$.th().text("Feld"),$$.th().text("Alt"),$$.th().text("Neu")]),$.each(e.history,((e,t)=>$$.tr(n.bdy).append([$$.tdc("keep",fdt(t.timestamp)),$$.td().text(t.target),$$.td().text(t.oldValue),$$.td().text(t.newValue)])))}$ocms.dlg(t,{width:800,form:!1})}})},warnExpiry:function(e){let t=Math.max(1,Math.round((e||0)/60));$fis.notifications.push({severity:"info",title:"Entwurf läuft ab",message:"Der Mahnentwurf läuft in etwa "+t+" Minute(n) ab. Bitte zwischenspeichern, sonst gehen die Änderungen verloren."})},closed:function(e){let t=$inv.rd.token();$inv.rd.tbl().removeData("rdtoken"),""!==t&&$fis.draft.release(t),$fis.frm_edit().remove(),$fis.lf(!0),$fis.notifications.push({severity:"error",title:"Entwurf geschlossen",message:"expired"===e?"Der Mahnentwurf ist wegen Inaktivität abgelaufen. Nicht gespeicherte Änderungen sind verloren.":"Der Mahnentwurf wurde geschlossen."});try{$inv.rReload()}catch(e){}},close:function(){let e=$inv.rd.token();""!==e&&($ocms.postXT({url:$ocms.url("rem/dclose"),data:{token:e}}),$fis.draft.release(e)),$inv.rd.tbl().removeData("rdtoken")}},$inv.cInv2=function(e){let t=$$.dc("rfrm").ldng(1),n=$ocms.dlg(t,{width:1e3});n&&n.ft.rwText($rct.rq1);let i=()=>{$ocms.postXT({url:$ocms.url("req/get"),timeout:60,data:{id:e.id,mode:"r"},success:t=>{t.admin=t.admin||{};let n=$fis.lf(!0).aC("fix").rC("hd");if($fis.frm_edit().IN(),$inv.eM(!0,!0),(t.requests||[]).length<1)n.aC("fix").text($rct.nd);else{$$.dc("lh",n,$rct.mdl);let i=$$.d(),a=$$.ul({class:"rql"}).data({search:e.id,parent:t.admin.parent}).appendTo(n),r={},l=$rcol.req.lbl();$.each(t.requests||[],(function(e,t){let n=$$.li({class:"cli rli"}).data($.extend({},t)).appendTo(a),s=$$.dc("lihd",n).addClass(t.state);!0===booln(t.open,!1)&&s.append($$.sc("cbox").click((()=>{n.tC("checked"),i.find("li").rC("checked"),!0===n.is(".checked")?$inv.rMn(t.open):$inv.eM(!0)}))),s.append([$$.sc("eid",t.ExternalId),$$.sc("nme",t.Name)]),$$.dc("lidt",n).append([$$.dc("rqs").append([$$.s(l.State+": "),$$.s($rct.sts[t.State||"-"])]),$$.dc("ivn").append([$$.s(l.InvoiceId+": "),$$.s(t.InvoiceId||"- -")]),$$.dc("wda").append([$$.s(l.WorkDoneAt+": "),$$.s(fdt(t.WorkDoneAt,"dd.MM.yyyy"))])]),r[t.Id]=n})),(t.inv||[]).length>0&&($$.dc("lh",n,$rct.invs),i=$$.ul({class:"ivl"}).appendTo(n),$.each(t.inv||[],((e,t)=>{let n=$$.li({class:"cli ili"}).data($.extend({},t)).appendTo(i),r=$$.dc("lihd",n).addClass(t.invstatus);!1===booln(t.isFinal,!0)?r.append($$.sc("cbox").click((()=>{""!==(t.Id||"")&&(n.tC("checked").siblings().rC("checked"),a.find("li").rC("checked"),!0===n.is(".checked")?$inv.iMnr(t):$inv.eM(!0))}))):["","dft"].indexOf(t.invstatus)<0&&r.append($$.sc("dli").click((function(){$inv.disp(t.Id,"inv")}))),r.append($$.sc("nme",t.DocumentName||t.Id)),$$.dc("lidt",n).append([$$.dc("wda").append([$$.s(fdt(t.DateCreated,"dd.MM.yyyy"))]),$$.d().text($ict.iSt[t.invstatus]||t.invstatus)])})))}},complete:()=>{n&&n.c.trigger("modal_close")}})};$ocms.postXT({url:$ocms.url("req/pget"),timeout:90,data:{id:e.id},success:e=>{n&&n.ft.rwText($rct.rq2),i()},error:()=>{confirm($rct.rq1f)?(n&&n.ft.rwText($rct.rq2),i()):n&&n.c.trigger("modal_close")}})},$inv.ccInv=function(e){let t=(e.data||{}).typ||"r",n=$fis.lf(),i=n.children("ul.rql"),a=i.data("parent"),r=[];if(i.find("li.rli.checked").each((function(){r.push($(this).data("Id"))})),r.length<1)return void alert($rct.dnS);if("i"===t&&r.length>1)return void alert($rct.dII);let l=$fis.frm_edit(),s=$$.dc("invoice_layout",l).append($$.dc("btn sprev").click($inv.sprev)),d=$fis.cf().width()>s.width()+n.width()+20;n.tC("fix",d).tC("hd",!d),$inv.eM(!1,!0);let c=$$.dc("rfrm").ldng(1),o=$ocms.dlg(c,{width:1e3});o.ft.rwText($rct.rq2),$ocms.postXT({url:$ocms.url("req/iget"),timeout:60,data:{id:a,mode:"ful",typ:t,sel:r.join(",")},success:e=>{let t=$$.dc("srq",s),n=$$.tblset({class:"invi"},t);n.bdy.remove(),n.ft=$$[0]("tfoot"),e.admin=e.admin||{},e.admin.p13b=bool(e.admin.p13b||"",!0===((e.inv||{}).InvoiceOptions||"").split(",").includes("§13b")),n.tbl.data($.extend({new:{},sms:{},itm:{}},{admin:e.admin,companies:e.companies,locations:e.locations}));let i=$$.tr(n.hd).aC("shd").append([$$.th().aC("aux")]);$rct.invHR.forEach((e=>$$.th(i,e))),n.tbl.on("fds.inv",$inv.invSumUpdate),$.each(e.requests||[],(function(t,i){if(0!==(i.Id||0)){let t=$inv.worknotes(i);i.text="i"===e.admin.type?$rct.req+jine([i.ExternalId,i.Name],": ").eine(" ",""):jine([jine([fdt(i.WorkDoneAt,"dd.MM.yy"),i.ExternalId]," - "+$rct.req+" "),t.ne(i.Name)],": \n");let a=$$.tbody(n.tbl).data($.extend({},i));$inv.rendersrq.call(a)}}));let a=$$.tr($$.tbody(n.tbl),{class:"placeholder"}).data({net_val:0,vat_val:0,svcnet_val:0,svcvat_val:0,net:0});$inv.rrw.call(a),n.ft.appendTo(n.tbl);let r,l,d=e.admin||{},c=(e,t,i,a,r)=>{let l=$$.dc("inpfrm",s).aC(e).append("string"==typeof a?$$.dc("ahd",a):a>0?$$.dc("ahd",$rct.frm[i]):null),d=$$.dc("content",l).rwText(t);$$.dc("axf",l).append($$.dc("ibtn edit",{title:$rct.frmTT[i]||$rct.frm[i]}).data("dialog",$rct.frm[i]).append(gi("pencil")).click($.extend({t:d,nme:i,change:e=>{n.tbl.data("new")[i]=e}},r),$inv.eHtml)),n.tbl.data("new")[i]=t};c("tfrm",d.invoicetitle,"invoicetitle",0,null),c("adrfrm",d.invoiceaddress,"invoiceaddress",0,null),c("locfrm","","loc",1,{list:deepCopy(e.locations),lbl:"ref",property:"address"}),$inv.emailFrm(s,n,d.invoiceemail,d.invoiceemailcc),$$.dc("sndfrm",s).append($$.dc("content").text(d.sender)),d.provisionend&&(l=d.provisionstart?$rct.provP:$rct.provD,r=d.provisionstart?fdt(d.provisionstart,"dd.MM.yyyy")+" - "+fdt(d.provisionend,"dd.MM.yyyy"):fdt(d.provisionend,"dd.MM.yyyy")),c("admfrm",r,"provisionperiod",l,1),n.tbl.data("new").CustomValues=d.CustomValues||"",$$.dc("inpfrm ctpfrm",s).text(jObj(d.CustomValues,"contactName")),n.tbl.children("tbody").each($inv.bdysort),n.tbl.trigger("fds.inv"),$inv.eM(!1,!0,$inv.emOpt())},complete:()=>{o.c.trigger("modal_close")}})},$inv.ccStInv=function(e){let t=e.data||{},n=$fis.lf(),i=t.id,a=$$.dc("invoice_layout",$fis.frm_edit()).append($$.dc("btn sprev").click($inv.sprev)),r=$fis.cf().width()>a.width()+n.width()+20;n.tC("fix",r).tC("hd",!r),$inv.eM(!1,!0);let l=$$.dc("rfrm").ldng(1),s=$ocms.dlg(l,{width:1e3});s.ft.rwText($ict.iq1),$ocms.postXT({url:$ocms.url("inv/pget"),timeout:90,data:{id:t.id},success:e=>{s&&s.ft.rwText($ict.iq2),$ocms.postXT({url:$ocms.url("inv/icget"),timeout:60,data:{id:i},success:e=>{let t=$$.dc("srq",a),n=$$.tblset({class:"invi"},t);n.bdy.remove(),n.ft=$$[0]("tfoot"),e.admin=e.admin||{},e.admin.p13b=bool(e.admin.p13b||"",!0===((e.inv||{}).InvoiceOptions||"").split(",").includes("§13b")),n.tbl.data($.extend({new:{},sms:{},itm:{}},{admin:e.admin,companies:e.companies,locations:e.locations}));let i=$$.tr(n.hd).aC("shd").append([$$.th().aC("aux")]);$rct.invHR.forEach((e=>$$.th(i,e))),n.tbl.on("fds.inv",$inv.invSumUpdate),$.each(e.requests||[],(function(t,i){if(0!==(i.Id||0)){let t=$inv.worknotes(i);i.text="i"===e.admin.type?$rct.req+jine([i.ExternalId,i.Name],": ").eine(" ",""):jine([fdt(i.WorkDoneAt,"dd.MM.yy")+t.ne(i.Name)],": ");let a=$$.tbody(n.tbl).data($.extend({},i));$inv.rendersrq.call(a)}}));let r=$$.tr($$.tbody(n.tbl),{class:"placeholder"}).data({net_val:0,vat_val:0,svcnet_val:0,svcvat_val:0,net:0});$inv.rrw.call(r),n.ft.appendTo(n.tbl);let l,s,d=e.admin||{},c=(e,t,i,r,l)=>{let s=$$.dc("inpfrm",a).aC(e).append("string"==typeof r?$$.dc("ahd",r):r>0?$$.dc("ahd",$rct.frm[i]):null),d=$$.dc("content",s).rwText(t);$$.dc("axf",s).append($$.dc("ibtn edit",{title:$rct.frmTT[i]||$rct.frm[i]}).data("dialog",$rct.frm[i]).append(gi("pencil")).click($.extend({t:d,nme:i,change:e=>{n.tbl.data("new")[i]=e}},l),$inv.eHtml)),n.tbl.data("new")[i]=t};c("tfrm",d.invoicetitle,"invoicetitle",0,null),c("adrfrm",d.invoiceaddress,"invoiceaddress",0,null),c("locfrm",d.provisionlocation,"loc",1,{list:deepCopy(e.locations),lbl:"ref",property:"address"}),$inv.emailFrm(a,n,d.invoiceemail,d.invoiceemailcc),$$.dc("sndfrm",a).append($$.dc("content").text(d.sender)),d.provisionend&&(s=d.provisionstart?$rct.provP:$rct.provD,l=d.provisionstart?fdt(d.provisionstart,"dd.MM.yyyy")+" - "+fdt(d.provisionend,"dd.MM.yyyy"):fdt(d.provisionend,"dd.MM.yyyy")),c("admfrm",l,"provisionperiod",s,1),n.tbl.data("new").CustomValues=d.CustomValues||"",$$.dc("inpfrm ctpfrm",a).text(jObj(d.CustomValues,"contactName")),n.tbl.children("tbody").each($inv.bdysort),n.tbl.trigger("fds.inv")},complete:()=>{s.c.trigger("modal_close")}})},error:()=>{s&&s.c.trigger("modal_close")}})},$inv.clCntInv=function(e){let t=$fis.lf(!1),n=[];t.find("li.ili.checked").each((function(){n.push($(this).data("Id"))})),1===n.length&&$inv.cntInv({id:n[0]})},$inv.cntInv=function(e){e=e||{};$fis.lf(!1).rC("fix").aC("hd");let t=$$.dc("invoice_layout",$fis.frm_edit()).append($$.dc("btn sprev").click($inv.sedit));$inv.eM(!1,!0);let n=$$.dc("rfrm").ldng(1),i=$ocms.dlg(n,{width:1e3});i.ft.rwText($rct.rq2),$ocms.postXT({url:$ocms.url("inv/get"),timeout:60,data:{id:e.id},success:e=>{e.admin=e.admin||{};let n=e.inv||{},i=$$.dc("srq",t),a=$$.tblset({class:"invi"},i);a.bdy.remove(),a.ft=$$[0]("tfoot"),a.tbl.data($.extend({invid:n.Id,new:{},sms:{},itm:{},bai:[]},e));let r=$$.tr(a.hd).aC("shd").append([$$.th().aC("aux")]);$rct.invHR.forEach((e=>$$.th(r,e))),a.tbl.on("fds.inv",$inv.invSumUpdate),$.each(e.req||[],(function(e,t){let n=$$.tbody(a.tbl).data($.extend({},t));$inv.rendersrq.call(n)}));let l=$$.tr($$.tbody(a.tbl),{class:"placeholder"}).data({net_val:0,vat_val:0,svcnet_val:0,svcvat_val:0,net:0});$inv.rrw.call(l),a.ft.appendTo(a.tbl);let s=(e,n,i,r,l)=>{let s=$$.dc("inpfrm",t).aC(e).append("string"==typeof r?$$.dc("ahd",r):r>0?$$.dc("ahd",$rct.frm[i]):null),d=$$.dc("content",s).rwText(n);$$.dc("axf",s).append($$.dc("ibtn edit",{title:$rct.frmTT[i]||$rct.frm[i]}).data("dialog",$rct.frm[i]).append(gi("pencil")).click($.extend({t:d,nme:i,change:e=>{a.tbl.data("new")[i]=e}},l),$inv.eHtml)),a.tbl.data("new")[i]=n};s("tfrm",n.InvoiceTitle,"invoicetitle",0,null),s("adrfrm",n.SendToAddress,"invoiceaddress",0,null),s("locfrm",n.ProvisionLocation,"loc",1,null),$inv.emailFrm(t,a,n.SendToEmail,n.SendToEmailCc),$$.dc("sndfrm",t).append($$.dc("content").text(e.admin.sender)),s("admfrm",n.ProvisionPeriod,"provisionperiod",!0===(n.ProvisionPeriod||"").includes("-")?$rct.provP:$rct.provD,1),a.tbl.data("new").CustomValues=n.CustomValues||"",$$.dc("inpfrm ctpfrm",t).text(jObj(n.CustomValues,"contactName")),a.tbl.children("tbody").each($inv.bdysort),a.tbl.trigger("fds.inv"),$inv.eM(!1,!0,$inv.emOpt())},complete:()=>{i.c.trigger("modal_close")}})},$inv.cSt=function(e){e=e||{};let t=$fis.lf(),n=$$.dc("invoice_layout",$fis.frm_edit()).append($$.dc("btn sprev").click($inv.sedit)),i=$fis.cf().width()>n.width()+t.width()+20;t.tC("fix",i).tC("hd",!i),$inv.eM(!1,!0);let a=$$.dc("rfrm").ldng(1),r=$ocms.dlg(a,{width:1e3});r.ft.rwText($ict.iq1),$ocms.postXT({url:$ocms.url("inv/pget"),data:{id:e.id},success:t=>{r&&r.ft.rwText($ict.iq2),$ocms.postXT({url:$ocms.url("inv/storno"),data:{id:e.id,mode:e.mode},success:e=>{e.admin=e.admin||{},e.admin.p13b=bool(e.admin.p13b||"",!0===((e.inv||{}).InvoiceOptions||"").split(",").includes("§13b"));let t=e.inv||{},i=$$.dc("srq",n),a=$$.tblset({class:"invi"},i);a.bdy.remove(),a.ft=$$[0]("tfoot"),a.tbl.data($.extend({invid:t.Id,new:{},sms:{},itm:{},bai:[]},e));let r=$$.tr(a.hd).aC("shd").append([$$.th().aC("aux")]);$rct.invHR.forEach((e=>$$.th(r,e))),a.tbl.on("fds.inv",$inv.invSumUpdate),$.each(e.req||[],(function(e,t){let n=$$.tbody(a.tbl).data($.extend({},t));$inv.rendersrq.call(n)}));let l=$$.tr($$.tbody(a.tbl),{class:"placeholder"}).data({net_val:0,vat_val:0,svcnet_val:0,svcvat_val:0,net:0});$inv.rrw.call(l),a.ft.appendTo(a.tbl);let s=(e,t,i,r,l)=>{let s=$$.dc("inpfrm",n).aC(e).append("string"==typeof r?$$.dc("ahd",r):r>0?$$.dc("ahd",$rct.frm[i]):null),d=$$.dc("content",s).rwText(t);$$.dc("axf",s).append($$.dc("ibtn edit",{title:$rct.frmTT[i]||$rct.frm[i]}).data("dialog",$rct.frm[i]).append(gi("pencil")).click($.extend({t:d,nme:i,change:e=>{a.tbl.data("new")[i]=e}},l),$inv.eHtml)),a.tbl.data("new")[i]=t};s("tfrm",t.InvoiceTitle,"invoicetitle",0,null),s("adrfrm",t.SendToAddress,"invoiceaddress",0,null),s("locfrm",t.ProvisionLocation,"loc",1,null),$inv.emailFrm(n,a,t.SendToEmail,t.SendToEmailCc),$$.dc("sndfrm",n).append($$.dc("content").text(e.admin.sender)),s("admfrm",t.ProvisionPeriod,"provisionperiod",!0===(t.ProvisionPeriod||"").includes("-")?$rct.provP:$rct.provD,1),a.tbl.data("new").CustomValues=t.CustomValues||"",$$.dc("inpfrm ctpfrm",n).text(jObj(t.CustomValues,"contactName")),a.tbl.children("tbody").each($inv.bdysort),a.tbl.trigger("fds.inv")},complete:()=>{r.c.trigger("modal_close")}})},error:()=>{r&&r.c.trigger("modal_close")}})},$inv.adrCountries=[["DE","Deutschland"],["AT","Österreich"],["CH","Schweiz"],["FR","Frankreich"],["NL","Niederlande"],["BE","Belgien"],["LU","Luxemburg"],["IT","Italien"],["ES","Spanien"],["PL","Polen"],["DK","Dänemark"],["CZ","Tschechien"],["GB","Großbritannien"],["US","USA"]],$inv.composeAddress=function(e){let t=[],n=e=>{""!==(e=(""+(e||"")).trim())&&t.push(e)};n((e=e||{}).name),""!==(""+(e.contact||"")).trim()&&n("z.Hd. "+(""+e.contact).trim()),n(e.line2||e.addressLine2),n(e.street),n(((e.postalCode||"")+" "+(e.city||"")).trim());let i=(""+(e.countryCode||"")).toUpperCase();return""!==i&&"DE"!==i&&n(i),t.join("\n")},$inv.adrCurrent=function(e){let t=jObj((e.data("new")||{}).CustomValues,"sendToAddress");if("string"==typeof t&&"{"===t.trim().charAt(0))try{t=JSON.parse(t)}catch(e){t=null}if(t&&"object"==typeof t)return t;let n=(e.data("admin")||{}).invoiceaddressData;if("string"==typeof n&&"{"===n.trim().charAt(0))try{return JSON.parse(n)}catch(e){}else if(n&&"object"==typeof n)return n;return{}},$inv.eAddress=function(e){let t=$inv.d.tbl(),n=$inv.adrCurrent(t),i=[{name:"name",label:"Name / Firma",type:"text",value:n.name||"",required:!0},{name:"contact",label:"z.Hd. (optional)",type:"text",value:n.contact||""},{name:"street",label:"Straße + Nr.",type:"text",value:n.street||""},{name:"line2",label:"Adresszusatz (optional)",type:"text",value:n.line2||n.addressLine2||""},{name:"postalCode",label:"PLZ",type:"text",value:n.postalCode||""},{name:"city",label:"Ort",type:"text",value:n.city||""},{name:"countryCode",label:"Land",type:"select",url:$inv.adrCountries,value:n.countryCode||"DE"},{name:"vatId",label:"USt-IdNr. (nur bei Firmen)",type:"text",value:n.vatId||""},{name:"leitwegId",label:"Leitweg-ID (nur Behörden / B2G)",type:"text",value:n.leitwegId||""}],a=$$.dc("adr-conformity").append([$$.dc("hd").text("Hinweis zur DATEV-/eRechnungs-Konformität"),$$.dc("tx").text("Pflicht: Name, Straße, PLZ, Ort und Land. Die USt-IdNr. nur bei Firmen angeben — für eine Rechnung an eine Privatperson einfach leer lassen. Eine Leitweg-ID nur bei Behörden (B2G) — dann wird die Rechnung automatisch als XRechnung erzeugt.")]);$ocms.dlgform(i,{title:"Rechnungsempfänger",addcontent:a,success:function(t){let n={name:t.name||"",contact:t.contact||"",line2:t.line2||"",street:t.street||"",postalCode:t.postalCode||"",city:t.city||"",countryCode:t.countryCode||"DE",vatId:(""+(t.vatId||"")).trim(),leitwegId:(""+(t.leitwegId||"")).trim()},i=$inv.composeAddress(n);e.data&&e.data.t&&e.data.t.rwText(i),"function"==typeof(e.data||{}).change&&e.data.change(i),$inv.d.sync({Target:"address",Value:n})}})},$inv.provToIso=function(e){let t=(""+(e||"")).match(/(\d{1,2})\.(\d{1,2})\.(\d{4})/);return t?t[3]+"-"+("0"+t[2]).slice(-2)+"-"+("0"+t[1]).slice(-2):""},$inv.eProvisionPeriod=function(e){let t=(""+(e.data&&e.data.t?e.data.t.text():"")).trim().match(/\d{1,2}\.\d{1,2}\.\d{4}/g)||[],n=[{name:"von",label:"Leistungsdatum",type:"date",value:$inv.provToIso(t[0]||"")},{name:"bis",label:"Leistungszeitraum – bis (optional)",type:"date",value:$inv.provToIso(t[1]||"")}],i=$$.dc("adr-conformity").append([$$.dc("hd").text("Leistungsdatum / -zeitraum"),$$.dc("tx").text('Für ein einzelnes Datum nur „Leistungsdatum" ausfüllen; für einen Zeitraum zusätzlich das Bis-Datum. Nur strukturierte Datumsauswahl — für die E-Rechnung empfohlen.')]);$ocms.dlgform(n,{title:"Leistungsdatum / -zeitraum",addcontent:i,success:function(t){let n=(""+(t.von||"")).trim(),i=(""+(t.bis||"")).trim(),a=""===n?"":""===i||i===n?n:n+" - "+i;e.data&&e.data.t&&e.data.t.rwText(a),"function"==typeof(e.data||{}).change&&e.data.change(a),$inv.d.sync({Target:"provisionperiod",Value:a})}})},$inv.eEmail=function(e){let t=[{name:"email",label:$rct.frm.invoiceemail,type:"text",value:(e.data.t||$$.s()).text()},{name:"emailcc",label:$rct.frm.invoiceemailcc,type:"text",value:(e.data.ccT||$$.s()).text()}];$ocms.dlgform(t,{title:$rct.frm.invoiceemail,success:function(t){let n=(""+(t.email||"")).trim(),i=(""+(t.emailcc||"")).trim();e.data&&e.data.t&&e.data.t.text(n),e.data&&e.data.ccT&&e.data.ccT.text(i),"function"==typeof(e.data||{}).change&&e.data.change(n),"function"==typeof(e.data||{}).changeCc&&e.data.changeCc(i),$inv.d.syncField("invoiceemail",n),$inv.rd.syncField("invoiceemail",n),$inv.d.syncField("invoiceemailcc",i),$inv.rd.syncField("invoiceemailcc",i)}})},$inv.emailFrm=function(e,t,n,i){let a=$$.dc("inpfrm emailccfrm",e),r=$$.dc("content",a).rwText(i),l=$$.dc("inpfrm emailfrm",e),s=$$.dc("content",l).rwText(n);$$.dc("axf",l).append($$.dc("ibtn edit",{title:$rct.frmTT.invoiceemail}).append(gi("pencil")).click({t:s,ccT:r,nme:"invoiceemail",change:e=>{t.tbl.data("new").invoiceemail=e},changeCc:e=>{t.tbl.data("new").invoiceemailcc=e}},$inv.eHtml)),t.tbl.data("new").invoiceemail=n,t.tbl.data("new").invoiceemailcc=i},$inv.eHtml=function(e){if(e.data&&!(e.data instanceof jQuery)&&$inv.d&&"function"==typeof $inv.d.token&&""!==$inv.d.token()){if("invoiceaddress"===e.data.nme)return $inv.eAddress.call(this,e);if("provisionperiod"===e.data.nme)return $inv.eProvisionPeriod.call(this,e)}if(e.data&&!(e.data instanceof jQuery)&&"invoiceemail"===e.data.nme&&e.data.ccT)return $inv.eEmail.call(this,e);let t=$(this),n=e.data instanceof jQuery?e.data:e.data.t,i=["invoiceemail","invoiceemailcc","provisionperiod","invoicetitle"].includes(e.data.nme),a=i?[{name:"txt",label:"Text",type:"text",value:n.text()}]:[{name:"txt",label:"Text",type:"html",value:n.html(),tinymce:!0,attr:{style:"height: 300px"}}],r=e.data.change||null,l={title:t.data("dialog")||"",success:function(t){i?n.text(t.txt||""):n.html(t.txt),"function"==typeof r&&r(t.txt),$inv.d.syncField(e.data.nme,i?t.txt||"":t.txt),$inv.rd.syncField(e.data.nme,i?t.txt||"":t.txt)},tinymce:{valid_elements:"br",hidemenu:!0,hidetoolbar:!0}};if(Array.isArray(e.data.list)){let t=$$.dc("lstfrm");$.each(e.data.list,((n,i)=>{let a=$$.dc("li",t).append(""!==(e.data.lbl||"")?$$.dc("lbl").rwText(i[e.data.lbl]):null);$$.dc("adr",a).rwText(i[e.data.property]).data("val",i[e.data.property]).click((function(){let e=$(this),t=e.closest(".modal-body").find(':input[name="txt"]');t.is(".tinymce")?tinymce.get(t.attr("id")).setContent($$.s().rwText(e.data("val")).html()):"TEXTAREA"===t.prop("tagName")?t.val(e.data("val")).change():t.rwText(e.data("val"))}))})),l.addcontent=t}$ocms.dlgform(a,l)},$inv.setVat=function(e){$(this);let t=e.data,n=prompt($rct.rqV);n&&(n=parseFloat(n.replace("%","")),n>1&&(n*=.01),!1===isNaN(n)&&(t.siblings(".itm").each((function(){$(this).data().vat=fnum(n,{style:"percent"}).replace(" ","")})),$inv.t_fds_inv()))},$inv.inRow=function(e){let t=$(this),n=e.data,i={},a=$rcol.itm.clone(["SortOrder","NameOrNumber","Type","quantityhours","UnitString","net","svcnet_val","svcvat_val","net_val","vat_val","vat","Note"]),r="N"+(65536*(1+Math.random())||0).toString(16).substr(6),l=$$.tr({id:"itm_"+r.toString(),class:"itm"});$ocms.dlgform(a,{title:t.data("dialog")||"",success:function(e){l.data($.extend({Id:r},i,e)),$inv.rrw.call(l),l.insertAfter(n),$inv.t_fds_inv()},typedvalues:!0})},$inv.eRow=function(e){let t=$(this),n=e.data,i=n.data()||{},a=["SortOrder","NameOrNumber","Type","quantityhours","UnitString","net","svcnet_val","svcvat_val","net_val","vat_val","vat","Note"];i.id||""!==(i.Type||"")||a.unshift("Type");let r=$rcol.itm.clone(a).applyValues(i);r.set("Type","hidden","type"),$inv.eRw.call(t,n,i,r)},$inv.eRw=function(e,t,n){let i=$(this);$ocms.dlgform(n,{title:i.data("dialog")||"",success:function(n){let i={};""===(t.Id||"")&&(i.Id="N"+(65536*(1+Math.random())||0).toString(16).substr(6),e.attr("id","itm_"+i.Id.toString())),i.quantity=((n.quantityhours||"").toString()+" "+(n.UnitString||"").toString()).trimEnd(),e.data($.extend({},t,n,i)),console.debug("eRw success %o",e.data()),$inv.rrw.call(e),$inv.t_fds_inv()},typedvalues:!0})},$inv.bdysort=(e,t)=>{$(t).Sortable({dragItem:!1,dragHandleClass:"ico",parentident:"tr",onend:()=>{$inv.t_fds_inv()}})},$inv.rowCtxMenu=function(e){let t=$$[0]("nav").aC("rowctx");return t.ocmsmenu([{glyph:"glyphicon-option-vertical",aclass:"ctxbtn",attr:{title:$rct.ctxM},itm:e}]),t.find("li[title]").each((function(){let e=$(this);e.children("a").attr("title",e.attr("title"))})),t},$inv.rrw=function(){let e=$(this),t=e.data(),n={},i=e.is(".placeholder"),a=e.is(".hidenote"),r=e=>$$.d().append(e).html(),l=[{lbl:$rct.iRb,attr:{title:$rct.iRb},data:e,fnc:$inv.inRow}];!1===i&&(l.unshift({lbl:$rct.cP,attr:{title:$rct.cP},data:e,fnc:$inv.eRow}),l.push({lbl:$rct.dR,attr:{title:$rct.dR},fnc:function(t){confirm($rct.cD)&&(e.remove(),$inv.t_fds_inv())}}),"set"===(t.Type||"").toLowerCase()&&0===(t.net_val||0)&&l.push({lbl:$rct.toSetP,attr:{title:$rct.toSetP},data:e,fnc:$inv.toSetPrice}));let s=$$.dc("axf").append($inv.rowCtxMenu(l));!0===i?n={id:"",typ:"placeholder"}:!0===e.is(".itm.osum")?n={invrqid:t.InvRqId,id:"osum"+e.index(),typ:"osum",p:"",q:null,t:r(t.tbl.tbl),tt:null,v:null,vt:t.net_val,vs:t.svcnet_val,vat:t.vat,vv:t.vat_val,vsv:t.svcvat_val,det:!1}:(n={invrqid:t.InvRqId,id:t.Id||"",typ:t.Type||"other",p:"",q:null,t:"",tt:null,v:null,vt:t.net_val,vs:t.svcnet_val,vat:t.vat,vv:t.vat_val,vsv:t.svcvat_val,det:""!==(t.Note||"")&&!1===a,SetItmId:t.SetItmId||null,lvl:t.lvl||0},$$.dc("ibtn ico move",s,{title:$rct.mR}),n.p=null!=t.position?t.position:t.SortOrder||"",""===n.id?n.t="":["Text","Title"].includes(n.typ)&&0===(t.net_val||0)?n.t=t.htmltext||("#"!==(t.NameOrNumber||"").substr(0,1)?r($$[0]("p").text(t.NameOrNumber)):"")+(t.Note||""):(n.tt=n.det?"":$$.s(t.Note||"").text(),n.q=t.quantity||(0!==(t.quantityhours||0)?fnum(t.quantityhours)+" "+(t.UnitString||""):""),n.t=t.htmltext||(n.det?r($$.s(t.NameOrNumber||""))+r($$.dc("desc").html(t.Note)):r($$.s(t.NameOrNumber||""))),n.v=t.net,n.vt=t.net_val)),""!==(t.Note||"")&&$$.dc("ibtn add",s,{title:$rct.noteToggle}).append(gi("object-align-left")).click((function(t){$inv.rrw.call(e.tC("hidenote"))}));let d=[$$.tdc("aux").append(s),$$.tdc("keep").text(n.p)];if(""===n.id)d.push($$.td(e,{colspan:4}).append(n.t));else{Array.prototype.push.apply(d,n.q?[$$.tdc("keep").text(n.q)]:[]);let e=e=>null==e?"":fnum(e,$rct.cst);Array.prototype.push.apply(d,[$$.tdc("txt",{colspan:n.q?1:2,title:n.tt}).append(n.t),$$.tdc("currency").text(e(n.v)),$$.tdc("currency inetval").text(e(n.vt)).attr("title",$rct.svcPart+": "+e(n.vs))])}e.empty().attr("class",i?"placeholder":"itm").aC(n.Typ).tC("sethdr","set"===(n.typ||"").toString().toLowerCase()).aC((n.lvl||0)>0?"lvl"+Math.min(n.lvl,6):"").tC("hidenote",a).append(d),t.co=n},$inv.toSetPrice=function(e){let t=(e.data.data().Id||"").toString();""!==t&&!1!==confirm($rct.toSetPc)&&$.when($inv.t_fds_inv()).done((()=>{$inv.d.sync({Target:"item.setprice",Ref:t})}))},$inv.invSumUpdate=function(){let e=$(this),t=[],n=e.children("tbody"),i=[];n.each(((e,n)=>{let a=$(n),r=a.data()||{},l=[],s=[],d=a.find("tr.itm");a.tC("empty",d.length<1),d.each(((e,t)=>{let n=$(t).data()||{};l.push(n.co);let a=$inv.itemToContract(n),r=(n.SetItmId||"").toString();""!==r&&r!==a.id&&(a.setId=r),s.push(a);let d=!1===["text","title"].includes((n.Type||"other").toLowerCase());n.position=((e,t)=>{if(!e)return"";let n=Math.max(t||0,0);for(;i.length<=n;)i.push(0);return i.length=n+1,i[n]++,i.join(".")})(d,(n.co||{}).lvl||0),$inv.rrw.call(t)})),t.push({Id:r.Id,nme:r.Name,text:r.text,itm:l,items:s})}));let a=e.find("tbody:not(.empty)").length;n.find("tr.isum").tC("hidden",a<2),e.data("bai",t),""===(e.data("dtoken")||"")&&!1===bool(e.data("dseeding"),!1)&&null!=(e.data("admin")||{}).type&&(e.data("dseeding",!0),$inv.d.seed($.extend($inv.invcPayload(e.data()),{invid:e.data("invid")||""})))},$inv.worknotes=function(e){let t="";return e.steps.forEach(((e,n)=>{let i;try{i=JSON.parse(e.Data||{}).fields||[]}catch(e){console.debug(e),i=[]}!0!==Array.isArray(i||"")&&(i="object"==typeof i&&!0===Array.isArray(i.field||"")?i.field:[]),i.forEach(((e,n)=>{"Ausgeführte Arbeiten"===e.name&&(t=e.result||"")}))})),t},$inv.rendersrq=function(){let e=$(this).empty(),t=e.is(".onesum"),n=e.data(),i=$$.tr(e,{id:"srq"+n.Id}).aC("title nosort"),a=($rcol.itm.lbl(),$$.dc("axf").appendTo($$.tdc("aux",i)));$$.dc("ibtn osum",a,{title:$rct.combP}).append(gi("euro")).click((function(t){e.tC("onesum"),$inv.rendersrq.call(e),$inv.t_fds_inv()})),$$.dc("ibtn setvat",a,{title:$rct.sV}).append(gi("gbp")).click(i,$inv.setVat),$$.dc("ibtn insb",a,{title:$rct.iRb}).append(gi("indent-left")).click(i,$inv.inRow);let r,l=$$.sc("text",n.text),s=($$.td(i,{colspan:t?4:5}).append(l),["net_val","vat_val","svcnet_val","svcvat_val","net"]);if($$.dc("ibtn edit",a,{title:$rct.sectionTitleEditTT}).data("dialog",$rcol.req.lbl().Name).append(gi("pencil")).click({t:l,change:e=>{n.text=e,$inv.t_fds_inv()}},$inv.eHtml),t&&($$.tdc("currency isumval",i),r={Id:n.Id.toString()+"_osum",net_val:0,vat_val:0,svcnet_val:0,svcvat_val:0,net:0},r.tbl=$$.tblset({class:"stbl"})),$.each(n.items||[],((n,i)=>{let a,l={Id:i.Id,net_val:i.net_val||0,vat_val:i.vat_val||0,svcnet_val:0,svcvat_val:0,net:i.net||0,Note:i.Note||""};if("service"===i.Type.toLowerCase())l.svcnet_val=i.net_val||0,l.svcvat_val=i.vat_val||0;t?(a=$$.tr(r.tbl.bdy,{id:"itm"+i.Id,class:"sitm"}).aC(i.Type),"Text"===i.Type||"Title"===i.Type?$$.td(a,{colspan:2}).html(i.htmltext||i.Note):($$.tdc("keep",a).text(i.quantity||((i.quantityhours||0)>0?fnum(i.quantityhours)+(i.UnitString||"").eine(" ",""):"")),i.htmltext?$$.tdc("txt",a).html(i.htmltext):$$.tdc("txt",a).text(i.NameOrNumber).attr("title",i.Note)),$.each(s,((e,t)=>{r[t]+=l[t]})),a.data(l)):($.extend(l,i),a=$$.tr(e,{id:"itm"+i.Id,class:"itm"}),a.data(l),$inv.rrw.call(a))})),t){let t=$$.tr(e,{id:"itmsq"+n.Id,class:"itm osum"}).data(r);$inv.rrw.call(t)}else{let t=$$.tr(e).aC("isum nosort");$$.tdc("aux",t),$$.td(t,{colspan:4}).text($rct.iSum),$$.tdc("currency isumval",t)}},$inv.t_fds_inv=()=>{let e=$("div.invoice_layout table.invi");if(e.trigger("fds.inv"),""!==(e.data("dtoken")||""))return $inv.d.syncChanged(e);let t=e.data("dseedpromise");return t?$.when(t).then((()=>$inv.d.syncChanged(e))):$.when()},$inv.sedit=()=>{$inv.sprev(!0)},$inv.jdisp=function(e){e.stopPropagation(),e.data.id&&$inv.disp(e.data.id,e.data.typ||"")},$inv.disp=(e,t)=>{let n="";switch(t){case"inv":n="inv/rdoc";break;case"rem":n="rem/rdoc"}if(""!==n){let t=$inv.pdfWaitDlg();$ocms.postXT({url:$ocms.url(n),data:{id:e||"",typ:"img"},timeout:$inv.pdfPreviewTimeout,success:e=>{let t=$$.dc("imagecollection pdfpreview"),n=Math.round(.88*vh());e.id;$.each(e.img||[],(function(e,i){$$.dc("pdfp",t).append($$.img(i).css("max-height",(n-rpx(6)).toString()+"px"))})),$ocms.dlg(t,{size:[n,Math.round(.88*vw())],zindex_min:50,form:!1,exclusive:!1})},error:$inv.pdfPreviewFailed,complete:$inv.pdfPreviewComplete(null,t)})}},$inv.jdbn=function(e){let t=$inv.pdfWaitDlg();$ocms.postXT({url:$ocms.url("inv/rdocn"),data:{name:e.data.id||"",typ:"img"},timeout:$inv.pdfPreviewTimeout,success:e=>{let t=$$.dc("imagecollection pdfpreview"),n=Math.round(.88*vh());e.id;$.each(e.img||[],(function(e,i){$$.dc("pdfp",t).append($$.img(i).css("max-height",(n-rpx(6)).toString()+"px"))})),$ocms.dlg(t,{size:[n,Math.round(.88*vw())],zindex:50,form:!1})},error:$inv.pdfPreviewFailed,complete:$inv.pdfPreviewComplete(null,t)})},$inv.sp13b=()=>{var e=$("div.invoice_layout").find("table.invi"),t=e.data();t.admin.p13b=!0,!1===(t.inv.InvoiceOptions||"").split(",").includes("§13b")&&(t.inv.InvoiceOptions+=",§13b"),e.trigger("fds.inv"),$inv.d.sync({Target:"p13b",Value:t.admin.p13b})},$inv.itemToContract=function(e){let t=((e=e||{}).Type||"").toString().toLowerCase(),n=e=>e??null,i={id:(e.Id||"").toString(),type:t,title:"",desc:"",qty:"",price_net:"",total_net:n(e.net_val),vat:e.vat||""};var a;return e.co&&"osum"===e.co.typ?(i.desc=e.co.t||"",i.total_net=e.net_val||0):["text","title"].includes(t)&&0===(e.net_val||0)?(i.desc=e.htmltext||("#"!==(e.NameOrNumber||"").substr(0,1)?(a=$$[0]("p").text(e.NameOrNumber||""),$$.d().append(a).html()):"")+(e.Note||""),i.total_net=""):(e.htmltext?i.desc=e.htmltext:(i.title=e.NameOrNumber||"",i.desc=e.Note||""),i.qty=e.quantity||(0!==(e.quantityhours||0)?fnum(e.quantityhours)+(e.UnitString?" "+e.UnitString:""):""),i.price_net=n(e.net),i.total_net=n(e.net_val)),i},$inv.hasSets=e=>((e||{}).req||[]).some((e=>{let t=((e||{}).itm||[]).filter((e=>e&&""!==(e.id||""))),n={};t.forEach((e=>{n[(e.id||"").toString()]=e}));return t.some((e=>{let t=(null==e.SetItmId?"":e.SetItmId).toString();return""!==t&&t!==(e.id||"").toString()&&n[t]&&(e=>"set"===(e.typ||"").toString().toLowerCase())(n[t])}))})),$inv.ssetmode=()=>{let e,t=$("div.invoice_layout").find("table.invi").data();if(t.dstate&&!1===$inv.hasSets(t.dstate))return void alert($rct.toSetMn);let n=t=>$$.dc("btn",$ict.setmo[t]).click((()=>{e.c.trigger("modal_close"),$inv.setSetmode(t)})),i=$$.dc("choicefrm").append([n("setprice"),n("setonly")]);e=$ocms.dlg(i,{width:800})},$inv.setSetmode=e=>{if(!1===confirm($rct.toSetMc||$rct.toSetPc))return;let t="setonly"===e?"block.setonly":"block.setprice";$.when($inv.t_fds_inv()).done((()=>{$inv.d.sync({Target:t})}))},$inv.sctp=()=>{let e=$invcol.ctp;$ocms.dlgform(e,{title:$ict.ctp,success:function(e){var t=$("div.invoice_layout"),n=t.find("table.invi").data();let i={};void 0!==n.new&&"{"===(n.new.CustomValues||"").substr(0,1)&&(i=JSON.parse(n.inv.CustomValues)),i.contactName=e.name,i.contactEmail=e.email,n.new.CustomValues=JSON.stringify(i),t.find(".ctpfrm").text(ne(e.name,e.email)),$inv.d.sync({Target:"contact",Value:{name:e.name,email:e.email}})},typedvalues:!0})},$inv.invcPayload=function(e){e=e||{};let t=$.extend({},e.new),n=$.extend({},e.admin);return t.title=null!=t.invoicetitle?t.invoicetitle:t.title||"",t.provisionlocation=null!=t.loc?t.loc:t.provisionlocation||"",t.paymentterm=null!=n.paymentterms?n.paymentterms:t.paymentterm||"",n.customerid=null!=n.customerid?n.customerid:n.CustomerId,{admin:n,req:e.bai,new:t}},$inv.ssave=()=>{$inv.d.save()},$inv.sprev=e=>{$inv.d.preview()},$inv.rReload=()=>{try{let e=$("#listframe ul.rql:first").data();$inv.cInv2({id:e.search})}catch(e){}},$inv.quantChange=function(e){},$inv.storno=function(e,t){let n,i=$$.dc("choicefrm").append([$$.dc("btn","Storno ohne Details").click({id:e,mode:"simple"},(e=>{n.c.trigger("modal_close"),$inv.cSt(e.data)})),$$.dc("btn","Storno mit neuer Rechnung").click({id:e},(e=>{n.c.trigger("modal_close"),$inv.ccStInv(e)})),$$.dc("btn","Storno mit best. Rechnung").tC("inactive",!1===bool(t,!1)).click({id:e,mode:"copy"},(e=>{!0===bool(t,!1)&&(n.c.trigger("modal_close"),$inv.cSt(e.data))}))]);n=$ocms.dlg(i,{width:1e3})},$inv.credit=function(e,t){let n,i=$$.dc("choicefrm").append([$$.dc("btn","Gutschrift").click({id:e,mode:"credit"},(e=>{n.c.trigger("modal_close"),$inv.cSt(e.data)}))]);n=$ocms.dlg(i,{width:1e3})},$inv.setPyd=function(e){confirm($ict.cpyd)&&$ocms.postXT({url:$ocms.url("inv/setpyd"),timeout:60,data:{id:e},success:e=>{alert($ict.relm)},error:()=>{alert($t.f1)}})},$inv.setUpd=function(e){confirm($ict.cupd)&&$ocms.postXT({url:$ocms.url("inv/setupd"),timeout:60,data:{id:e},success:e=>{alert($ict.relm)},error:()=>{alert($t.f1)}})},$inv.resendRem=function(e){e.stopPropagation(),e.data.id&&confirm(string($ict.remresc,[e.data.name]))&&$ocms.postXT({url:$ocms.url("rem/resend"),timeout:60,data:{id:e.data.id},success:t=>{alert(string($ict.remresr,[e.data.name]))},error:()=>{alert($t.f1)}})},$inv.dspRem=function(e){let t=$$.dc("rfrm").ldng(1),n=$ocms.dlg(t,{width:1e3});n.ft.rwText($rct.rq2),$ocms.postXT({url:$ocms.url("inv/getrem"),timeout:60,data:{id:e,drafts:!1},success:e=>{n.ft.empty();let i=$$.tblset({class:"invtbl"},t.empty()),a=$invcol.rem2,r=$$.tr(i.hd);$$.th(r);$.each(a.fields||[],((e,t)=>{$$.th(r).text(t.label)}));let l=!1;$.each(e,((e,t)=>{l=!l;let n=$$.tr(i.bdy).tC("alt",l),r=$$.td(n);n.click((function(){n.tC("selected").siblings().rC("selected")})),!0===bool(t.hasFile,!1)&&($$.dc("idl ilbtn",r,{title:$ict.dl+"\n"+t.DocumentName}).append(gi("save-file","ico")).click({id:t.Id},$inv.downloadrem),$$.dc("idl ilbtn",r,{title:$ict.remdsp+"\n"+t.DocumentName}).append(gi("eye-open","ico")).click({id:t.Id,typ:"rem"},$inv.jdisp),$$.dc("idl ilbtn",r,{title:$ict.remres+"\n"+t.DocumentName}).append(gi("refresh","ico")).click({id:t.Id,typ:"rem",name:t.DocumentName},$inv.resendRem)),$.each(a.fields||[],((e,i)=>{let a=$$.td(n).aC(i.dtype),r=t[i.name];if("function"==typeof i.dfnc)i.dfnc.call(a,r,t);else switch(i.type||""){case"date":a.text(fdt(t[i.name],"dd.MM.yy"));break;case"datetime":a.text(fdt(t[i.name]));break;case"html":a.append($$.dc("ctw").html(r)),a.append($$.dc("ttip").html(r));break;default:a.text(t[i.name])}if("InvoiceId"===(i.name||""))a.aC("keep");switch(typeof i.title){case"function":i.title.call(a,t);break;case"string":a.attr("title",cs.title)}}))}))},error:()=>{t.empty(),n.ft.rwText($t.f1)},complete:()=>{t.ldng(0)}})},$inv.ccRem=function(e,t){$(this);$ocms.postXT({url:$ocms.url("rem/lrem"),timeout:60,data:{id:e},success:n=>{let i=$invcol.rid.clone();i.applyValues(n.ov);let a=$$.dc("ac"),r=$$.tblset({class:"fullgrid fullwidth"},a);if((n.lst||[]).length>0){$$.d({style:"margin: 1.5rem 0 1rem 0;font-size: 110%;text-decoration: underline;"}).prependTo(a).text($ict.rovlh);let e=$$.tr(r.hd);$ict.rovl.forEach(((t,n)=>$$.th(e,t))),$.each(n.lst,((e,t)=>{$$.tr(r.bdy).append([$$.tdc("keep",t.subject),$$.tdc("currency",fnum(t.amount,$rct.cst)),$$.tdc("currency",fnum(t.amount_payed,$rct.cst)),$$.tdc("keep",fdt(t.DateFinalized,"dd.MM.yy"))])}))}else $$.td($$.tr(r.bdy),$ict.nd);$ocms.dlgform(i,{addcontent:a,title:string($ict.remdt,[t||"?"]),success:function(t){$inv.ccRem_s2(e,t)},typedvalues:!0})}})},$inv.rRemRw=function(e){let t=$(this),n=e.rm||{};t.empty().data({invoiceid:n.invoiceid,invoicedate:n.invoicedate,amount:n.amount,amount_payed:n.amount_payed});let i=[{lbl:$rct.cP,attr:{title:$rct.cP},data:t,fnc:$inv.eRowR}],a=$$.dc("axf").append($inv.rowCtxMenu(i));t.append([$$.tdc("aux").append(a),$$.tdc("keep",n.invoiceid),$$.tdc("keep",fdt(n.invoicedate,"dd.MM.yy")),$$.tdc("currency",fnum(n.amount,$rct.cst)),$$.tdc("currency",fnum(n.amount_payed,$rct.cst)),$$.tdc("currency",fnum(n.amount-n.amount_payed,$rct.cst))])},$inv.eRowR=function(e){let t=$(this),n=e.data,i=n.data()||{},a=$invcol.rem.clone().applyValues(i);$ocms.dlgform(a,{title:t.data("dialog")||"",success:function(e){let i=t.closest("table"),a=i.data();$.extend(a.rm,e),i.data(a),$inv.rRemRw.call(n,a),$inv.rd.syncAmount(a.rm.amount,a.rm.amount_payed)},typedvalues:!0})},$inv.ccRem_s2=function(e,t){$fis.lf(!1).rC("fix").aC("hd");let n=$$.dc("invoice_layout",$fis.frm_edit()).append($$.dc("btn sprev").click($inv.rprev));$inv.eM(!1,!0);$$.dc("rfrm").ldng(1);$ocms.postXT({url:$ocms.url("rem/get"),timeout:60,data:$.extend({id:e},t),success:e=>{let t=e.rm||{},i=$$.dc("srq",n),a=$$.tblset({class:"invi"},i);a.ft=$$[0]("tfoot"),a.tbl.data($.extend({invid:t.invid,new:{}},e));let r=$$.tr(a.hd).aC("shd").append([$$.th().aC("aux")]);$ict.remHR.forEach((e=>$$.th(r,e))),$inv.rRemRw.call($$.tr(a.bdy),a.tbl.data()),a.ft.appendTo(a.tbl);let l={invoiceemail:"Email-Adresse ändern",subject:"Betreff ändern"},s=(e,t,i,r,s)=>{let d=$$.dc("inpfrm",n).aC(e).append("string"==typeof r?$$.dc("ahd",r):r>0?$$.dc("ahd",$rct.frm[i]):null),c=$$.dc("content",d).rwText(t);$$.dc("axf",d).append($$.dc("ibtn edit",{title:l[i]||$rct.frmTT[i]||$rct.frm[i]}).data("dialog",$rct.frm[i]).append(gi("pencil")).click($.extend({t:c,nme:i,change:e=>{a.tbl.data("new")[i]=e}},s),$inv.eHtml)),a.tbl.data("new")[i]=t};s("tfrm",t.subject,"subject",0,null),s("adrfrm",t.invoiceaddress,"invoiceaddress",0,null),s("emailfrm",t.invoiceemail,"invoiceemail",0,null),$$.dc("sndfrm",n).append($$.dc("content").text(t.sender)),a.tbl.children("tbody").each($inv.bdysort),a.tbl.trigger("fds.inv");let d=a.tbl.data("new");d.amount=t.amount,d.amount_payed=t.amount_payed,$inv.rd.seed({rem:{invid:t.invid,type:t.type,invoiceid:t.invoiceid,invoicedate:t.invoicedate},new:d})},complete:()=>{}})},$inv.rprev=()=>{$inv.rd.preview()},$inv.sis=e=>{confirm($ict.sisc)&&$ocms.postXT({url:$ocms.url("inv/sis"),data:{id:e||""},success:e=>{}})},$inv.srs=e=>{confirm($ict.srsc)&&$ocms.postXT({url:$ocms.url("rem/srs"),data:{id:e||""},success:e=>{}})},$inv.mfrrel=e=>{$("#contentframe").ldng(),$ocms.postXT({url:$ocms.url("inv/mfrrel"),data:{id:e||""},success:e=>{$inv.rerenderinv()},complete:()=>{$("#contentframe").ldng(0)}})},$inv.sets={o:null,c:null,drag:null,isOpen:()=>!!$inv.sets.o,open:function(){let e=$inv.d.tbl();if(e.length<1||$inv.sets.isOpen())return;if(""===$inv.d.token()&&!e.data("dstate"))return;let t=$$.dc("setstruct");$inv.sets.c=t,$inv.sets.o=$ocms.dlg(t,{title:$ict.setst,size:[-1,960],exclusive:!1,close:()=>{$inv.sets.o=null,$inv.sets.c=null,$inv.sets.drag=null}});let n=e.data("dstate");n?$inv.sets.render(n):$inv.d.refresh()},title:e=>{let t=$$.d().html(e.t||"").text().replace(/\s+/g," ").trim();return""!==t?t:$ict.setsNoTitle||""},typLbl:e=>{let t=(e.typ||"").toString().toLowerCase();return($ict.settyp||{})[t]||e.typ||""},isSet:e=>"set"===(e.typ||"").toString().toLowerCase(),parentOf:(e,t)=>{let n=(null==e.SetItmId?"":e.SetItmId).toString(),i=(e.id||"").toString();if(""===n||n===i)return"";let a=t[n];return a&&$inv.sets.isSet(a)?n:""},isDescendant:(e,t,n)=>{let i={},a=n[e];for(;a;){let e=$inv.sets.parentOf(a,n);if(""===e||i[e])return!1;if(e===t)return!0;i[e]=!0,a=n[e]}return!1},canDrop:(e,t,n,i)=>!!e&&e.bid===n&&e.id!==t&&!$inv.sets.isDescendant(t,e.id,i),sync:e=>($inv.sets.c&&$inv.sets.c.aC("busy"),$inv.d.sync(e)),render:function(e){let t=$inv.sets.c;if(!t)return;let n=t.closest(".modal-body"),i=n.length?n.scrollTop():0;t.empty().rC("busy"),$$.dc("shint",t).text($ict.setsHint||""),(e.req||[]).forEach((e=>{if(!e)return;let n=(e.Id||"").toString();if(""===n)return;let i=(e.itm||[]).filter((e=>e&&""!==(e.id||""))),a={};i.forEach((e=>{a[(e.id||"").toString()]=e}));let r=$$.dc("sblock",t).data({bid:n});$inv.sets.rootZone($$.dc("sbhd",r).append($$.sc("nme",e.text||e.nme||n)),n,a);let l=$$.tblset({class:"stbl"},r),s=$$.tr(l.hd);($ict.setsHR||[]).forEach((e=>$$.th(s,e))),i.forEach((e=>$inv.sets.row(l.bdy,e,n,i,a))),$inv.sets.rootZone($$.dc("sroot",r).text($ict.setsRoot||""),n,a),$inv.sets.createBar(r,n,i,a)})),n.length&&n.scrollTop(i)},collapsed:{},hiddenByCollapse:function(e,t){let n={},i=e;for(;i;){let e=$inv.sets.parentOf(i,t);if(""===e||n[e])return!1;if($inv.sets.collapsed[e])return!0;n[e]=!0,i=t[e]}return!1},zone:function(e,t,n){let i=e.originalEvent||e,a=t[0].getBoundingClientRect(),r=(i.clientY||0)-a.top,l=a.height||1;return r<.3*l?"before":r>.7*l||!n?"after":"into"},clearDrop:()=>{$(".setstruct .dropok, .setstruct .dropbefore, .setstruct .dropafter").rC("dropok dropbefore dropafter")},row:function(e,t,n,i,a){let r=(t.id||"").toString(),l=parseInt(t.lvl||0,10)||0,s=$inv.sets.isSet(t),d=$inv.sets.parentOf(t,a),c=s&&!!$inv.sets.collapsed[r],o=$$.tr(e,{draggable:"true"}).aC("srow lvl"+l).tC("isset",s).tC("folded",c).data({id:r,bid:n});$inv.sets.hiddenByCollapse(t,a)&&o.aC("hid"),$$.tdc("grip",o).append(gi("move")).attr("title",$rct.mR),$$.tdc("pos",o).text(null!=t.p?t.p:"");let u=$$.tdc("typ",o);s&&u.append($$.sc("fold").attr("title",c?$ict.setsExpand:$ict.setsCollapse).append(gi(c?"triangle-right":"triangle-bottom")).click((e=>{e.stopPropagation(),c?delete $inv.sets.collapsed[r]:$inv.sets.collapsed[r]=!0;let t=$inv.d.tbl().data("dstate");t&&$inv.sets.render(t)}))),u.append($$.s($inv.sets.typLbl(t))),$$.tdc("qty",o).text(t.q||"");let m=$$.tdc("ttl",o);if(""!==d&&m.append($$.sc("seti",$inv.sets.title(a[d]))),m.append($$.sc("txt",$inv.sets.title(t)).click((function(e){e.stopPropagation(),$(this).tC("exp")}))),s){let e=i.filter((e=>$inv.sets.parentOf(e,a)===r)).length;m.append($$.sc("cnt"," ("+e+")"))}let v=i.filter((e=>$inv.sets.parentOf(e,a)===d)),p=v.findIndex((e=>(e.id||"").toString()===r)),f=v.slice(0,p).some((e=>$inv.sets.isSet(e))),h=$$.tdc("act",o),g=(e,t,n,i,a)=>$$.dc("ibtn "+e,h,{title:n}).append(gi(t)).tC("disabled",!i).click((()=>{i&&$inv.sets.sync(a)}));g("up","arrow-up",$ict.setsUp,p>0,{Target:"set.move",Ref:r,Value:-1}),g("down","arrow-down",$ict.setsDown,p>=0&&p0,{Target:"set.level",Ref:r,Value:-1}),g("in","chevron-right",$ict.setsIn,f,{Target:"set.level",Ref:r,Value:1}),o.on("dragstart",(e=>{$inv.sets.drag={id:r,bid:n},o.aC("dragging");try{e.originalEvent.dataTransfer.setData("text/plain",r),e.originalEvent.dataTransfer.effectAllowed="move"}catch(e){}})).on("dragend",(()=>{o.rC("dragging"),$inv.sets.drag=null,$inv.sets.clearDrop()}));return o.on("dragover",(e=>{if(!$inv.sets.canDrop($inv.sets.drag,r,n,a))return;e.preventDefault();let t=$inv.sets.zone(e,o,s);o.rC("dropok dropbefore dropafter").aC("into"===t?"dropok":"before"===t?"dropbefore":"dropafter")})).on("dragleave",(()=>{o.rC("dropok dropbefore dropafter")})).on("drop",(e=>{e.preventDefault(),$inv.sets.clearDrop();let t=$inv.sets.drag;if($inv.sets.drag=null,!$inv.sets.canDrop(t,r,n,a))return;let i=$inv.sets.zone(e,o,s);"into"===i?$inv.sets.sync({Target:"set.assign",Ref:t.id,Value:{parent:r}}):$inv.sets.sync({Target:"set.move",Ref:t.id,Value:{anchor:r,where:i}})})),o},rootZone:function(e,t,n){return e.on("dragover",(i=>{(()=>{let e=$inv.sets.drag;return!!e&&e.bid===t&&!!n[e.id]&&""!==$inv.sets.parentOf(n[e.id],n)})()&&(i.preventDefault(),e.aC("dropok"))})).on("dragleave",(()=>{e.rC("dropok")})).on("drop",(i=>{i.preventDefault(),e.rC("dropok");let a=$inv.sets.drag;$inv.sets.drag=null,a&&a.bid===t&&n[a.id]&&""!==$inv.sets.parentOf(n[a.id],n)&&$inv.sets.sync({Target:"set.assign",Ref:a.id,Value:{parent:""}})})),e},createBar:function(e,t,n,i){let a=$$.dc("screate",e),r=$("").attr({name:"typ"}).append([$$.opt("set",$ict.settyp.set),$$.opt("text",$ict.settyp.text)]),l=$("").attr({name:"parent"}).append($$.opt("",$ict.setsTop));n.forEach((e=>{if(!$inv.sets.isSet(e))return;let t=parseInt(e.lvl||0,10)||0;l.append($$.opt((e.id||"").toString()," ".repeat(3*t)+$inv.sets.title(e)))}));let s=$('').attr({name:"title",placeholder:$ict.setsTitle,maxlength:250}),d=()=>{let e=(s.val()||"").toString().trim();""!==e?($inv.sets.sync({Target:"set.create",Ref:t,Value:{typ:r.val(),title:e,parent:l.val()||""}}),s.val("")):s.focus()};return s.on("keydown",(e=>{"Enter"===e.key&&(e.preventDefault(),d())})),a.append([$$.sc("lbl",$ict.setsNew),r,$$.sc("lbl",$ict.setsInto),l,s,$$.bbtn($ict.setsAdd,"sadd").click(d)]),a}}; \ No newline at end of file +let $rct={mdl:"Aufträge",or:"offene Aufträge",orr:"offene Aufträge (4 W)",rn:"Auftragsnummer",iov:{all:"Auftragsübersicht (alle)","":"Auftragsübersicht"},wk:"Woche",nd:"Keine Daten gefunden.",h:"Uhr",rq1:"Auftragsdaten werden von MFR abgerufen.\nDer Vorgang kann bis zu 90Sek dauern.",rq2:"Auftragsdaten werden geladen",rq1f:"Die Auftragsdaten von MFR konnten nicht oder nicht schnell genug abgerufen werde.\nMöchten Sie mit den bestehenden Daten trotzdem weitermachen?",note1:"Im Bruttobetrag sind {0} Lohnkosten enthalten (netto {1}). Die darin enthaltene Umsatzsteuer beträgt {2}.",note2:"Bitte beachten Sie, nach §14 Abs. 1 Umsatzsteuergesetz ist diese Rechnung ein Zahlungsbeleg oder eine andere beweiskräftige Unterlage für 2 Jahre nach Ablauf des Kalenderjahres der Ausstellung dieser Rechnung aufzubewahren, soweit nicht aufgrund anderer gesetzlicher Regelungen andere ggf.längere Aufbewahrungsfristen gelten.",note3:"Privathaushalten erstattet das Finanzamt bis zu {0} des Arbeitslohns mit der nächsten Steuererklärung.",note4:"Für bereits erbrachte Arbeiten, Dienstleistungen, Materiallieferungen und getätigte Bestellvorgänge zum oben genannten Bauvorhaben, die sich aus dem mit Ihnen geschlossenen Vertrag ergeben, stellen wir Ihnen vertragsgemäß unsere Akontozahlung in Rechnung. Eine Endabrechnung erhalten Sie als Schlussrechnung nach Abschluss des gesamten Bauvorhabens. Das Ausführungsdatum entnehmen Sie bitte dem Schlusstext dieser Rechnung. Wir danken Ihnen herzlich für das entgegengebrachte Vertrauen und bitten Sie um kurzfristigen Ausgleich der Akontorechnung.",note13b:"Gem. §13b Umsatzsteuergesetz unterliegen Sie der Steuerschuldnerschaft des Leistungsempfängers zur Umsatzsteuer aus dieser Rechnung mit einem Steuersatz von 19%.",crI:"Rechnung erstellen",crII:"Abschlagsrechnung erstellen",dII:"Für eine Abschlagsrechnung darf nur ein Auftrag gewählt werden.",dnS:"Für eine Rechnung muss mindestens ein Auftrag gewählt werden.",inv:"Rechnung",invs:"Rechnungen",req:"Auftrag",provP:"Leistungszeitraum",provD:"Leistungsdatum",cP:"Position ändern",iRb:"Zeile darunter einfügen",dR:"Zeile löschen",sV:"USt festlegen",cD:"Löschen?",mR:"Zeile verschieben",ctxM:"Weitere Aktionen",noteToggle:"Notiz ein-/ausblenden",sectionTitleEditTT:"Auftragsbezeichnung ändern",svcPart:"Service-Anteil",vat:"Umsatzsteuer",combP:"Positionen zusammenfassen",toSetP:"Auf Setpreis umstellen (Positionen ohne Preis)",toSetPc:"Der Set-Preis wird auf die Summe seiner Positionen gesetzt und die Positionen selbst verlieren ihren Preis. Das ist nicht rückgängig zu machen (der Betrag kann danach nur noch manuell geändert werden). Fortfahren?",toSetMc:"Jedes Set erhält die Summe seiner Positionen als Set-Preis; die Positionen des Sets werden ohne Preis dargestellt bzw. ausgeblendet. Positionen ausserhalb eines Sets bleiben unverändert einzeln aufgeführt. Das ist nicht rückgängig zu machen (die Set-Preise können danach nur noch manuell geändert werden). Fortfahren?",toSetMn:'Diese Rechnung enthält kein Set. Legen Sie zuerst über "Set-Struktur bearbeiten" ein Set an bzw. ordnen Sie Positionen einem Set zu.',iSum:"Zwischensumme",dtRel:"Freigegeben am: ",dtCr:"Erstellt am: ",rqV:"USt des Auftrags?",cthd:"wirklich aus-/einblenden ?",cst:{style:"currency",currency:"EUR"},sts:{IsWorkDone:"Arbeiten erledigt",Closed:"Auftrag geschlossen",SubcontractorPendingConfirmation:"Warten auf Bestätigung (Unterauftrag)",Scheduled:"Geplant",OfferIsRejected:"Angebot abgelehnt",OfferIsSend:"Offen (Angebot versandt)",CollaborationWaitingConfirmation:"Warten auf Bestätigung (Zusammenarbeit)",Released:"Freigegeben",OfferIsConfirmed:"Bestätigt",InProgress:"In Bearbeitung",ReadyForScheduling:"Zur Planung",Created:"Erstellt",Rejected:"Abgebrochen",Invoiced:"Rechnung gestellt","-":"-"},invHR:["Pos.","Menge","Artikelbezeichnung","VK","Summe"],frm:{invoicetitle:"Titel",invoiceaddress:"Adresse",loc:"Leistungsort / Lieferadresse",invoiceemail:"Email",invoiceemailcc:"Zusatzempfänger (CC)",provisionperiod:"Leistungsdatum / -zeitraum"},frmTT:{invoicetitle:"Rechnungstitel ändern",invoiceaddress:"Rechnungsempfänger-Adresse ändern",loc:"Leistungsort oder Lieferadresse ändern",invoiceemail:"Email-Adresse ändern und zusätzliche Email-Empfänger festlegen",provisionperiod:"Leistungsdatum oder -zeitraum ändern"}},$rcol={req:new fields_definition("Auftrag","Aufträge",[{name:"tags",label:"",type:"string",dfnc:function(e,t){""!==(e||"")&&($(this).aC("tags"),e.split(",").forEach((e=>{""!==e&&$(this).append($$.sc("tag "+e.replace(" ","_").replace("/","_").toLowerCase(),e))})))}},{name:"DateOfCreation",label:"Datum",type:"date",title:function(e){$(this).attr("title",$rct.dtCr+fdt(e.DateOfCreation).ne("-")+" \n"+$rct.dtRel+fdt(e.DateReleased).ne("-"))}},{name:"CustomerName",label:"Kunde (Firma)",type:"string"},{name:"Name",label:"Auftragsname",type:"string"},{name:"ExternalId",label:"Auftragsnummer",type:"string"},{name:"ParentExtenalId",label:"PAuftrag",type:"string"},{name:"InvoiceId",label:"RNummer",type:"string",dfnc:function(e,t){$(this).rwText(e," ").find("span").each((function(){$(this).aC("cla").click({id:$(this).text()},$inv.jdbn)}))}},{name:"State",label:"Status",type:"string"},{name:"WorkDoneAt",label:"Erledigt am",type:"date"},{name:"Description",label:"Beschreibung",type:"html"}]),itm:new fields_definition("Auftragsposition","Auftragspositionen",[{name:"NameOrNumber",label:"Bezeichnung",type:"string"},{name:"Type",label:"Typ",type:"select",required:!0,value:"Text",url:[{value:"Text",label:"Text"},{value:"Equipment",label:"Ausrüstung"},{value:"Material",label:"Material"},{value:"Service",label:"Arbeitsleistung"}],change:function(e){$req.quantChange.call(this,e)}},{name:"quantityhours",label:"Anzahl / Menge",type:"number",precision:"0.01",value:1,change:function(e){$inv.quantChange.call(this,e)}},{name:"UnitString",label:"Einheit",type:"select",url:["LFDM","Stck","Std.","QM","AW","Pauschal"],change:function(e){$inv.quantChange.call(this,e)}},{name:"net",label:"EinzelPreis netto",type:"number",precision:"0.01",value:0,change:function(e){$inv.quantChange.call(this,e)}},{name:"net_val",label:"GesamtPreis netto",type:"number",precision:"0.01",value:0},{name:"vat_val",label:"GesamtPreis USt",type:"number",precision:"0.01",value:0},{name:"svcnet_val",label:"Arbeitslohn netto",type:"number",precision:"0.01",value:0},{name:"svcvat_val",label:"Arbeitslohn USt",type:"number",precision:"0.01",value:0},{name:"net_pos",label:"Netto",type:"string"},{name:"bo_pos",label:"Brutto",type:"string"},{name:"vat",label:"USt",type:"string",value:"19,0%",change:function(e){$inv.quantChange.call(this,e)}},{name:"Note",label:"Details",type:"html",tinymce:!0}])},$ict={mdl:"Rechnungen",iov:{all:"Rechnungen (alle)","":"Rechnungen (nur fertige)","#d":"Rechnungen (nur Entwürfe)","#u":"Rechnungen (nur unbezahlt)","#r":"Rechnungen (nur angemahnt)","#a":"Rechnungen (nur Akonto)","#c":"Rechnungen (nur Storno)","#ru":"Rechnungen (nur angemahnt + unbez.)"},uba:", gesamter Zeitraum)",req:"Auftrag",inv:"Rechnung",rem:"Mahnung",in:"Rechnungsnummer",cc:"Kunde",wk:"Woche",nd:"Keine Daten gefunden.",dl:"Herunterladen",ed:"Bearbeiten",ced:"Bearbeitung fortsetzen",sItm:"Einzelheiten anzeigen",sPay:"Zahlungen anzeigen",cdI:"Entwurf der Rechnung löschen?",rel:"Neu Laden",relm:"Bitte laden Sie Liste manuell neu, um die Änderungen zu sehen.",dsp:"Rechnung anzeigen",storno:"Storno-Rechnung erstellen",credit:"Gutschrift erstellen",remd:"Mahnung erstellen",remdt:"Mahnung erstellen zur Rechnung {0}",remlst:"Mahnungen anzeigen",remdsp:"Mahnung anzeigen",remres:"Mahnung erneut senden",remresc:"Mahnung {0} wirklich erneut senden?",remresr:"Mahnung {0} wurde erfolgreich versandt.",setpyd:"Bezahlt markieren",cpyd:"Rechnung wirklich als bezahlt markieren?",setupd:"Bezahlt-Markierung aufheben",cupd:"Bezahlt-Markierung wirklich aufheben?",ivE:"Die Email-Adresse ist vermutlich nicht gültig.",ivEc:"\nMöchten Sie fortfahren?",pna:"Diese Seite ist in der Vorschau nicht verfügbar",bdLbl:"Rechnungsdatum auf den letzten Werktag des Vormonats setzen ({0})",bdTT:"Nur möglich, solange im neuen Monat noch keine Rechnung erstellt wurde. Rechnungsnummer und Fälligkeit richten sich nach diesem Datum.",tpe:"Die Anzahl von {0} Seiten wird aktuell nicht unterstützt",eis:"Der Rechnungsentwurf konnte nicht gespeichert werden.",pvw:"Das Dokument wird abgerufen und für die Vorschau aufbereitet.\nDer Vorgang kann bis zu 2 Minuten dauern.",pvf:"Die PDF-Vorschau konnte nicht erstellt werden.",pvto:"Der Server hat nicht rechtzeitig geantwortet (Zeitüberschreitung). Bitte versuchen Sie es erneut.",pvgone:"Der Entwurf ist auf dem Server nicht mehr vorhanden (Sitzung abgelaufen). Bitte öffnen Sie den Entwurf erneut.",iss:"Zwischenstand speichern.",p13b:"USt -> §13b",setm:"Set-Preisanzeige",setmo:{setprice:"Set mit Preis – Positionen ohne Preis",setonly:"Nur Set mit Preis – Positionen ausgeblendet"},setst:"Set-Struktur bearbeiten",setsHint:'Reihenfolge: Zeile per Drag & Drop an den oberen/unteren Rand einer anderen Zeile ziehen (davor/danach) oder ▲▼ nutzen. Zuordnung: Zeile auf die Mitte eines Sets ziehen (hinein) bzw. auf die Auftragszeile oder "oberste Ebene" (aus dem Set lösen); ◀▶ ändert die Ebene. Sets lassen sich über das Dreieck zu-/aufklappen und auch zugeklappt verschieben – ihre Positionen wandern mit. Änderungen werden sofort übernommen.',setsUp:"Nach oben (innerhalb der Ebene)",setsDown:"Nach unten (innerhalb der Ebene)",setsCollapse:"Set zuklappen",setsExpand:"Set aufklappen",setsHR:["","Pos.","Typ","Menge","Bezeichnung","Reihenfolge / Ebene"],setsRoot:"Hierher ziehen = aus dem Set lösen (oberste Ebene)",setsOut:"Eine Ebene höher (aus dem Set lösen)",setsIn:"Eine Ebene tiefer (dem vorangehenden Set zuordnen)",setsNew:"Neu:",setsInto:"in",setsTop:"oberste Ebene",setsTitle:"Bezeichnung",setsAdd:"Hinzufügen",setsNoTitle:"(ohne Bezeichnung)",settyp:{set:"Set",text:"Text",title:"Text",material:"Material",service:"Arbeitsleistung",equipment:"Ausrüstung",other:"Position",osum:"Zusammenfassung",intinvoiceallocation:"Abschlag",intinvoiceallocationdiff:"Abschlag (offen)"},ctp:"Ansprechpartner festlegen",mfr:"Von MFR neu abrufen",rq1:"Auftragsdaten werden von MFR abgerufen.\nDer Vorgang kann bis zu 90Sek dauern.",rq2:"Auftragsdaten werden geladen",iq1:"Rechnungsdaten werden von MFR abgerufen.\nDer Vorgang kann bis zu 90Sek dauern.",iq2:"Rechnungsdaten werden geladen",sis:"Rechnung als versandt markieren",srs:"Mahnung als versandt markieren",sisc:"Rechnung wirklich als versandt markieren?",srsc:"Mahnung wirklich als versandt markieren?",iSt:{dft:"Entwurf",uns:"nicht versandt",pyd:"bezahlt",cc:"storniert",op:"offen",due:"fällig",ovd:"überfällig",rem:"angemahnt"},rSt:["","Überfällig","2. Mahnung","3. Stufe"],pSt:{a:"Vollst.",p:"Teilz."},ivT:{i:"AbschlagsR.",f:"SchlussR",r:"Rechnung",c:"StornoR."},rovlh:"Übersicht der bisherigen Mahnungen",rovl:["Betreff","Betrag","Betrag gezahlt","fertiggestellt am"],remHR:["Rechnung","vom","Rechnungsbetrag","bereits bezahlt","noch offen"],translatePaymentTerm:e=>(e||"").replace("wd"," Werktagen").replace("d"," Tagen").replace("wk"," Wochen")||"10 Tagen",payi:{account:"Konto",name:"Zahler",text:"Verw.Zweck",InvoiceID:"Rechnung",amount:"Betrag",date:"Datum",manual:"Typ"}},$invcol={datev:new fields_definition("Rechnung","Rechnungen",[{name:"Umsatz (ohne Soll/Haben-Kz)",label:"Umsatz (ohne Soll/Haben-Kz)",type:"string"},{name:"vf",label:"vf",type:"string"},{name:"Soll/Haben-Kennzeichen",label:"Soll/Haben-Kennzeichen",type:"string"},{name:"Konto",label:"Konto",type:"string"},{name:"Gegenkonto",label:"Gegenkonto",type:"string"},{name:"BU-Schlüssel",label:"BU-Schlüssel",type:"string"},{name:"Belegdatum",label:"Belegdatum",type:"string"},{name:"Belegfeld 1",label:"Belegfeld 1",type:"string"},{name:"Belegfeld 2",label:"Belegfeld 2",type:"string"},{name:"Buchungstext",label:"Buchungstext",type:"string"}]),inv:new fields_definition("Rechnung","Rechnungen",[{name:"invstatus",label:"Status",type:"select",url:$ict.iSt},{name:"balance",label:"Umsatz",type:"string",dtype:"currency"},{name:"CustomerName",label:"Kunde",type:"string"},{name:"InvoiceId",label:"RNummer",type:"string"},{name:"InvoiceType",label:"Typ",type:"select",url:$ict.ivT},{name:"request",label:"Auftrag",type:"string",dtype:"num"},{name:"vat",label:"MwSt",type:"string",dtype:"num"},{name:"deb_cred",label:"Soll/Haben",type:"string"},{name:"customer",label:"Konto",type:"string",dtype:"num"},{name:"contra_account",label:"Gegenkonto",type:"string",dtype:"num"},{name:"Belegdatum",label:"Belegdatum",type:"date"},{name:"reminderstatus",label:"MahnStatus",type:"select",url:$ict.rSt},{name:"reminder",label:"# Mahnungen",type:"integer"},{name:"Buchungstext",label:"Buchungstext",type:"string"},{name:"Payment",label:"Zahlung",type:"string"}]),rem:new fields_definition("Zahlungserinnerung","Zahlungserinnerung",[{name:"amount",label:"Rechnungsbetrag",type:"number",precision:"0.01",value:1},{name:"amount_payed",label:"bereits bezahlt",type:"number",precision:"0.01",value:1}]),rem2:new fields_definition("Zahlungserinnerung","Zahlungserinnerung",[{name:"DocumentName",label:"Name",type:"string"},{name:"subject",label:"Betreff",type:"string"},{name:"DateSent",label:"Versanddatum",type:"date"},{name:"status",label:"Status",type:"string"},{name:"amount_open",label:"offener Betrag",type:"number",precision:"0.01"},{name:"InvoiceId",label:"RNummer",type:"string"}]),rid:new fields_definition("Zahlungserinnerung","Zahlungserinnerung",[{name:"type",label:"Typ",type:"select",url:[["f","einfache Zahlungserinnerung"],["m","Mahnung"],["l","letzte Mahnung"]],required:!0},{name:"level",label:"Stufe",type:"select",url:[["1","Stufe 1"],["2","Stufe 2"],["3","Stufe 3"],["4","Stufe 4"],["5","Stufe 5"],["6","Stufe 6"]],required:!0}]),ctp:new fields_definition("Ansprechpartner","Ansprechpartner",[{name:"name",label:"Name",type:"string"},{name:"email",label:"Email",type:"string"}])},gi=(e,t)=>$$.sc("glyphicon glyphicon-"+e).aC(t),$inv={init2:function(e,t){e=e||"inv",t=t||{},$ocms.getScript([],(function(){$inv.init3(e,t)}))},init3:async function(e,t){$fis.cf(!0);let n=$fis.lf(!0);$("#topbar").ocmsmenu([]),$("#activemodule").text($ict.mdl);let i=[(async()=>{await $fis.getAuth("fds_inv")>0&&($inv.prepLst(""),n.aC("fix"))})(),new Promise(((e,t)=>{$fis.prepAuth(["fds_reminder"])}))];await Promise.all(i)},prepLst:function(e){let t=new Date,n=$fis.lf(!0).ldng(1),i=new Date("2021-01-01");$fis.frm_list().IN((function(){}));let a=[];$.each($ict.iov,((e,t)=>{a.push({lbl:t,fnc:()=>{$inv.prepLst(e),n.aC("fix")}})})),$fis.lfm().ocmsmenu([{lbl:"Filter",itm:a}]);$$.i({placeholder:$ict.in}).appendTo($$.dc("mth ivn",n)).enterKey((function(e){let t=$(this),n=t.val()||"";e.stopPropagation(),t.parent().siblings().rC("selected"),n.length>3&&(t.parent().aC("selected"),$inv.renderinv("i:"+n,"s","all"),t.val(""))})),$$.i({placeholder:$ict.cc}).appendTo($$.dc("mth ivc",n)).enterKey((function(e){let t=$(this),n=t.val()||"";e.stopPropagation(),t.parent().siblings().rC("selected"),n.length>=3&&(t.parent().aC("selected"),$inv.renderinv("c:"+n,"s","all"),t.val(""))}));"#"===e.substr(0,1)&&$$.dc("mth extra",n).text($ict.iov[e].replace(")",$ict.uba)).click((function(t){let n=$(this);if(t.stopPropagation(),n.siblings().rC("selected"),!0===n.is(".selected")){n.toggleClass("selected");let t=fdt(new Date,"yy-MM-dd");$inv.renderinv(t,"a",e)}n.aC("selected")})),n.append("
");let r=$$.dc("mthl",n),l=t.getFullYear(),s=t.getMonth()+1;for(let t=i.getFullYear();t<=l;t++){let n=$$.dc("yr").prependTo(r).text($ict.iov[e]+" - "+t.toString()).toggleClass("selected",t===l);n.click({yr:t},(function(e){e.stopPropagation(),n.siblings().rC("selected"),n.aC("selected")}));let a=$$.dc("mfrm",n);for(let n=0;n<(t!==l?12:s);n++){i=new Date(t,n,1);let r=$$.dc("mth").prependTo(a).text($ict.iov[e]+" - "+fdt(i,"MMM yyyy"));if(r.click({yr:t,mt:n},(function(t){if(t.stopPropagation(),r.siblings().rC("selected"),!0===r.is(".selected")){r.toggleClass("selected");let n=fdt(new Date(t.data.yr,t.data.mt,1),"yy-MM-dd");$inv.renderinv(n,"m",e)}r.aC("selected")})),""===e){$$.dc("mthdl",r).append(gi("compressed","ico")).click({yr:t,mt:n},(function(e){e.stopPropagation();let t=fdt(new Date(e.data.yr,e.data.mt,1),"yy-MM-dd");$inv.downloadzip(t,"m")}))}let l=getMonday(i),s=new Date(i);s.setMonth(s.getMonth()+1),s.setDate(0),s=getMonday(s);let d=$$.dc("wfrm",r);for(;l<=s;){let t=$$.dc("wk",d).text(($ict.wk||"W")+" "+fdt(l,"dd.MM.yy"));t.click({rd:new Date(l)},(function(n){n.stopPropagation();let i=fdt(n.data.rd,"yy-MM-dd");$inv.renderinv(i,"w",e),r.siblings().rC("selected").find(".wk").rC("selected"),r.aC("selected").find(".wk").rC("selected"),t.aC("selected")})),$$.dc("wkdl",t).append(gi("compressed","ico")).click({rd:new Date(l)},(function(e){e.stopPropagation();let t=fdt(e.data.rd,"yy-MM-dd");$inv.downloadzip(t,"w")})),l.setDate(l.getDate()+7)}}}n.ldng(0)},rerenderinv:function(){let e=$("#contentframe .invfrm:first");if(e.length>0){let t=e.data("sets")||{};t.mode&&$inv.renderinv(t.tgt,t.mode,t.includes)}},renderinv:function(e,t,n){let i=$fis.frm_list(!0,!0).ldng(1),a=$$.dc("invfrm",i).aC("md"+t).data("sets",$.extend({},{tgt:e,mode:t,includes:n})),r=$fis.lf();$ocms.postXT({url:$ocms.url("inv/invl"),data:{mode:t,tgt:e,includes:n},success:i=>{r.rC("fix").aC("hd"),$$.dc("ovhd",a).text(i.admin.title);let l=$$.tblset({},a),s=$invcol.inv,d=$$.tr(l.hd);$$.th(d);$.each(s.fields||[],((e,t)=>{$$.th(d).text(t.label),"vat"===t.name&&$$.th(d)})),$.each(i.invoices||[],((d,c)=>{let o=$$.tr(l.bdy);o.click((function(){r.rC("fix").aC("hd"),o.toggleClass("selected").siblings().rC("selected").find("td.av").rC("av"),o.find("td.av").rC("av"),!0===o.is(".selected")?$inv.iMn(c):$inv.eM()}));let u=$$.td(o,{class:"raux"});c.hasFile?($$.dc("idl ilbtn",u,{title:$ict.dl+"\n"+c.DocumentName}).append(gi("save-file","ico")).click({id:c.Id},$inv.downloadinv),$$.dc("idl ilbtn",u,{title:$ict.dsp+"\n"+c.DocumentName}).append(gi("eye-open","ico")).click({id:c.Id,typ:"inv"},$inv.jdisp)):!1===c.isFinal&&!0===$fis.isAuth("fds_inv",2)&&$$.dc("idl ilbtn",u,{title:$ict.ed}).append(gi("edit","ico")).click({id:c.Id},$inv.doContInv),$$.dc("iitm ilbtn",u,{title:$ict.sItm}).append(gi("list","ico")).click({id:c.Id},$inv.showitm),$$.dc("iitm ilbtn",u,{title:$ict.sPay}).append(gi("euro","ico")).click({id:c.Id},$inv.showpay),$.each(s.fields||[],((r,l)=>{let s,d,u=$$.td(o).aC(l.dtype);switch("select"===(l.type||"")?u.text((l.url||{})[c[l.name]]||""):u.text(c[l.name]),l.name||""){case"vat":s=$$.sel().appendTo($$.td(o,{class:"vsel"})),d=(i.admin.ust_options||"19,0%;16,0%;0,0%").split(";"),$.each(d,((e,t)=>{$$.opt(t,t).appendTo(s)})),s.click((function(e){e.stopPropagation()})).val(c[l.name]).change().change({frm:a,tgt:e,mode:t,id:c.Id,td:u,includes:n},$inv.setvat),u.toggleClass("hl",c[l.name].substr(0,2)!==d[0].substr(0,2)).click((function(e){e.stopPropagation(),$(this).toggleClass("av")}));break;case"balance":u.aC("sh_"+(c.SollHaben||"").toLowerCase());break;case"invstatus":case"reminderstatus":u.aC(("invstatus"===l.name?"is_":"rs_")+c[l.name])}}))}))},complete:()=>{i.ldng(0)}})},setvat:function(e){let t=$(this),n=e.data||{};$ocms.postXT({url:$ocms.url("inv/setvat"),data:{id:n.id,val:t.val()},success:e=>{n.td.rC("av"),$inv.renderinv(n.tgt,n.mode,n.includes)}})},downloadzip:function(e,t){$(this).empty();window.open($ocms.url("inv/datevzip?mode="+t+"&tgt="+encodeURIComponent(e)),"_blank")},showitm:function(e){let t=$(this).closest("tr");e.stopPropagation(),!1!==t.is(".selected")&&$ocms.postXT({url:$ocms.url("inv/rqi"),data:{id:e.data.id},success:e=>{let t=$$.dc("rfrm");(e.requests||[]).length<1?t.text($ict.nd):$.each(e.requests||[],(function(e,n){let i=$$.dc("srq",t);$$.dc("nme",i).text(n.name);let a=$$.tblset({class:"if"},i);$.each(n.items||[],((e,t)=>{let n=$$.tr({id:"itm"+t.Id}).appendTo(a.bdy);$$.td(n).text(t.NameOrNumber),$$.td(n).text(t.Type),$$.td(n).aC("currency").text(t.net_pos),$$.td(n).aC("currency").text(t.bo_pos),$$.td(n).aC("num").text(t.vat)}))})),$ocms.dlg(t,{width:1e3})}})},showpay:function(e){let t=$(this).closest("tr");e.stopPropagation(),!1!==t.is(".selected")&&$ocms.postXT({url:$ocms.url("inv/pyi"),data:{id:e.data.id},success:e=>{let t=$$.dc("rfrm");if((e.payments||[]).length<1)t.text($ict.nd);else{let n=$$.tblset({class:"if"},t),i=$$.tr(n.hd);$.each(["date","account","name","text","InvoiceID","amount","manual"],((e,t)=>{$$.th(i,$ict.payi[t])})),$.each(e.payments,((e,t)=>{let i=$$.tr({id:"itm"+t.banking_uid}).appendTo(n.bdy);$$.td(i).aC("date").text(t.date),$$.td(i).text(t.account),$$.td(i).text(t.name),$$.td(i).text(t.text),$$.td(i).text(t.InvoiceID),$$.td(i).aC("currency").text(t.amount),$$.td(i).text(t.manual)}))}$ocms.dlg(t,{width:1e3,title:"Übersicht der Zahlungen"})}})},downloadinv:function(e){let t=$(this).closest("tr");e.stopPropagation(),!1!==t.is(".selected")&&window.open($ocms.url("inv/rdoc?id="+e.data.id),"_blank")},doContInv:function(e){let t=$(this).closest("tr");e.stopPropagation(),!1!==t.is(".selected")&&$inv.cntInv({id:e.data.id})}},$$inv={init2:$inv.init2,auth:{}};export default $$inv;$inv.cInv=function(e){let t=$(this).closest("tr");e.stopPropagation(),!1!==t.is(".selected")&&!1!==$fis.isAuth("fds_inv",2)&&$inv.cInv2({id:e.data.id})},$inv.rMn=e=>{let t=[{lbl:$ict.req,itm:[]}];return!0===bool(e,!1)&&!0===$fis.isAuth("fds_inv",2)&&Array.prototype.push.apply(t[0].itm,[{lbl:$rct.crI,fnc:$inv.ccInv,data:{typ:"r"}},{lbl:$rct.crII,fnc:$inv.ccInv,data:{typ:"i"}}]),t.push({lbl:$ict.rel,fnc:$inv.rReload}),$("#topbar").ocmsmenu(t)},$inv.iMnr=e=>{let t=booln(e.isFinal,!0),n=e.Id,i=booln(e.fds,!1),a=[{glyph:"glyphicon-menu-left",fnc:()=>{$fis.frm_edit().remove()}},{lbl:$ict.inv,itm:[]},{lbl:$ict.rem,itm:[]}];return!1===t&&!0===$fis.isAuth("fds_inv",2)?a[1].itm.push({lbl:$ict.ced,fnc:$inv.clCntInv}):!0===$fis.isAuth("fds_inv",1)&&a[1].itm.push({lbl:$ict.dsp,fnc:()=>$inv.disp(n,"inv")}),!0===i&&!0===t&&!0===$fis.isAuth("fds_inv",2)&&(a[1].itm.push({lbl:$ict.storno,fnc:()=>$inv.storno(n,i)}),a[1].itm.push({lbl:$ict.credit,fnc:()=>$inv.credit(n,i)})),!0===t&&!0===$fis.isAuth("fds_reminder",2)&&(a[2].itm.push({lbl:$ict.remd,fnc:()=>$inv.ccRem(n,e.InvoiceId)}),a[2].itm.push({lbl:$ict.remlst,fnc:()=>$inv.dspRem(n)})),!0===t&&!0===$fis.isAuth("fds_reminder",2)&&!1===booln(e.IsSent,!1)&&a[2].itm.push({lbl:$ict.srs,fnc:()=>$inv.srs(n)}),a.push({lbl:$ict.rel,fnc:$inv.rReload}),$("#topbar").ocmsmenu(a)},$inv.iMn=e=>{let t=booln(e.isFinal,!0),n=e.Id,i=booln(e.fds,!1),a=[{glyph:"glyphicon-menu-left",fnc:()=>{$fis.frm_edit().remove()}},{lbl:$ict.inv,itm:[]},{lbl:$ict.rem,itm:[]}];return!1===t&&!0===$fis.isAuth("fds_inv",2)?a[1].itm.push({lbl:$ict.ced,fnc:()=>{$inv.cntInv({id:n})}}):!0===$fis.isAuth("fds_inv",1)&&a[1].itm.push({lbl:$ict.dsp,fnc:()=>$inv.disp(n,"inv")}),!0===$fis.isAuth("fds_inv",2)&&(a[1].itm.push({lbl:$ict.storno,fnc:()=>$inv.storno(n,i)}),a[1].itm.push({lbl:$ict.credit,fnc:()=>$inv.credit(n,i)})),!0===t&&!1===booln(e.IsPayed,!1)?(!0===$fis.isAuth("fds_reminder",2)&&a[2].itm.push({lbl:$ict.remd,fnc:()=>$inv.ccRem(n,e.InvoiceId)}),!0===$fis.isAuth("fds_inv",2)&&a[1].itm.push({lbl:$ict.setpyd,fnc:()=>$inv.setPyd(n)})):!0===t&&!0===booln(e.IsPayed,!1)&&"m"===(e.PaymentStatus||"")&&!0===$fis.isAuth("fds_inv",2)&&a[1].itm.push({lbl:$ict.setupd,fnc:()=>$inv.setUpd(n)}),!0===$fis.isAuth("fds_reminder",2)&&a[2].itm.push({lbl:$ict.remlst,fnc:()=>$inv.dspRem(n)}),!0===t&&!0===$fis.isAuth("fds_inv",2)&&!1===booln(e.IsSent,!1)&&a[1].itm.push({lbl:$ict.sis,fnc:()=>$inv.sis(n)}),!1===i&&a[1].itm.push({lbl:$ict.mfr,fnc:()=>$inv.mfrrel(n)}),$("#topbar").ocmsmenu(a)},$inv.emOpt=()=>"iss,p13b,ctp,setst,setm",$inv.eM=(e,t,n)=>{let i=[];return!0!==booln(e,!1)&&!0!==booln(t,!1)||i.push({glyph:"glyphicon-menu-left",fnc:()=>{$fis.lf(!0),$fis.frm_edit().remove()}}),!0===(n||"").split(",").includes("iss")&&i.push({lbl:$ict.iss,fnc:$inv.ssave}),!0===(n||"").split(",").includes("ctp")&&i.push({lbl:$ict.ctp,fnc:$inv.sctp}),!0===(n||"").split(",").includes("p13b")&&i.push({lbl:$ict.p13b,fnc:$inv.sp13b}),!0===(n||"").split(",").includes("setm")&&i.push({lbl:$ict.setm,fnc:$inv.ssetmode}),!0===(n||"").split(",").includes("setst")&&i.push({lbl:$ict.setst,fnc:()=>$inv.sets.open()}),!0===(n||"").split(",").includes("iss")&&(i.push({lbl:"Änderungshistorie",fnc:()=>$inv.d.history()}),i.push({lbl:"Änderungen verwerfen",fnc:()=>$inv.d.discard()})),!0===booln(e,!1)&&i.push({lbl:$ict.rel,fnc:$inv.rReload}),$("#topbar").ocmsmenu(i)},$inv.pdfPreviewTimeout=12e4,$inv.pdfPreviewFailed=function(e,t){if(11110===(e||{}).internalCode)return void $ocms.login.dlg();let n=((e||{}).internalText||"").trim();""===n&&"timeout"===t&&(n=$ict.pvto),""===n&&410===(e||{}).status&&(n=$ict.pvgone),alert(($ict.pvf||$t.f1)+(""!==n?"\n"+n:""))},$inv.pdfPreviewComplete=function(e,t){return(n,i)=>{t&&t.c.trigger("modal_close"),e&&e.rC("freeze"),"timeout"===i&&$inv.pdfPreviewFailed(n,i)}},$inv.pdfWaitDlg=function(){let e=$ocms.dlg($$.dc("rfrm").ldng(1),{exclusive:!1,zindex_min:50});return e&&e.ft.rwText($ict.pvw),e},$inv.d={tbl:()=>$("div.invoice_layout table.invi"),layout:()=>$("div.invoice_layout"),token:function(){return $inv.d.tbl().data("dtoken")||""},hashes:function(){let e=$inv.d.tbl().data("bai")||[],t={};return $.each(e,((e,n)=>{t[(n.Id||"").toString()]=JSON.stringify(n)})),t},seed:function(e){let t=$inv.d.layout();t.aC("freeze");let n=$ocms.postXT({url:$ocms.url("inv/dopen"),data:{payload:JSON.stringify(e)},success:e=>{$inv.d.tbl().data("dtoken",e.token).data("dver",e.version).data("dhashes",$inv.d.hashes()).data("dorder",$inv.d.order()),$fis.draft.bind(e.token,{onReady:()=>$inv.d.refresh(),onExpiring:e=>$inv.d.warnExpiry(e),onClosed:e=>$inv.d.closed(e)}),$inv.d.refresh()},error:()=>{t.rC("freeze")},complete:()=>{$inv.d.tbl().removeData("dseeding").removeData("dseedpromise")}});return $inv.d.tbl().data("dseedpromise",n),n},refresh:function(e){let t=$inv.d.token();""!==t&&$ocms.postXT({url:$ocms.url("inv/dstate"),data:{token:t},success:t=>{$inv.d.applyState(t),"function"==typeof e&&e(t)},error:e=>{e&&410===e.status&&$inv.d.closed("expired")},complete:()=>{$inv.d.layout().rC("freeze")}})},applyState:function(e){let t=$inv.d.tbl();if(t.length<1)return;let n=t.data("dver");"number"==typeof n&&"number"==typeof e.version&&e.version$$.dc("dnote").aC(e.style||"InvoiceNotes").text(e.text)))},applyItems:function(e,t){let n=e=>void 0===e?null:e;(t||[]).forEach((t=>{if(!t)return;let i=(t.Id||"").toString();if(""===i)return;let a=e.children("tbody").filter(((e,t)=>(($(t).data()||{}).Id||"").toString()===i)).first();if(a.length<1)return;let r=t.itm||[],l={},s=a.find("tr.title").first(),d=s.length?s:null;r.forEach((e=>{let t=(e.id||"").toString();if(""===t)return;l[t]=!0;let i=a.find("#itm"+t).first(),r=i.length<1;r&&(i=$$.tr(a,{id:"itm"+t,class:"itm"}));let s=i.data()||{},c=r||(s.Type||"")!==(e.typ||"")||s.net!==n(e.v)||s.net_val!==n(e.vt)||s.vat_val!==n(e.vv)||s.svcnet_val!==n(e.vs)||s.svcvat_val!==n(e.vsv)||(s.position||"")!==(null!=e.p?e.p:"")||(s.lvl||0)!==(e.lvl||0)||(s.SetItmId||null)!==(null!=e.SetItmId?e.SetItmId:null);$.extend(s,{Id:t,Type:e.typ,net:n(e.v),net_val:n(e.vt),vat_val:n(e.vv),svcnet_val:n(e.vs),svcvat_val:n(e.vsv),vat:e.vat,position:null!=e.p?e.p:"",SetItmId:null!=e.SetItmId?e.SetItmId:null,lvl:e.lvl||0}),r&&$.extend(s,{htmltext:e.t,quantity:e.q}),i.data(s),d?i.prev()[0]!==d[0]&&i.insertAfter(d):a.children().first()[0]!==i[0]&&a.prepend(i),d=i,c&&$inv.rrw.call(i)})),a.find("tr.itm").each(((e,t)=>{let n=(($(t).data()||{}).Id||"").toString();""===n||l[n]||$(t).remove()}))}))},applySetDisplay:function(e,t){e.find("tr.itm").each(((e,n)=>{let i=$(n),a=((i.data()||{}).Id||"").toString();if(""===a||!Object.prototype.hasOwnProperty.call(t,a))return;let r=t[a]||{};i.tC("sethdr",bool(r.h,!1)),!1===bool(r.p,!0)&&i.find("td.currency").text("")}))},sync:function(e){let t=$inv.d.token();if(""===t){let t=$inv.d.tbl().data("dseedpromise");return t?$.when(t).then((()=>$inv.d.sync(e))):$.when()}return $inv.d.layout().aC("freeze"),$ocms.postXT({url:$ocms.url("inv/dpatch"),data:{token:t,delta:JSON.stringify(e)},success:()=>{$inv.d.refresh()},error:e=>{$inv.d.layout().rC("freeze"),e&&410===e.status&&$inv.d.closed("expired")}})},order:function(){return($inv.d.tbl().data("bai")||[]).map((e=>(e.Id||"").toString()))},syncChanged:function(e){let t=e.data("bai")||[],n=e.data("dhashes")||{},i={},a=[],r=[],l=[];$.each(t,((e,t)=>{let r=(t.Id||"").toString(),l=JSON.stringify(t);i[r]=l,n[r]!==l&&a.push(t)})),$.each(n,(e=>{void 0===i[e]&&r.push(e)}));let s=$inv.d.order(),d=e.data("dorder")||[];return e.data("dhashes",i).data("dorder",s),a.forEach((e=>l.push($inv.d.sync({Target:"block.replace",Ref:(e.Id||"").toString(),Value:e})))),r.forEach((e=>l.push($inv.d.sync({Target:"block.remove",Ref:e})))),d.length===s.length&&d.slice().sort().join(",")===s.slice().sort().join(",")&&d.join(",")!==s.join(",")&&l.push($inv.d.sync({Target:"block.order",Value:s})),$.when.apply($,l).promise()},syncField:function(e,t){let n={invoicetitle:"title",invoiceaddress:"address",invoiceemail:"email",invoiceemailcc:"emailcc",loc:"provisionlocation",provisionlocation:"provisionlocation",provisionperiod:"provisionperiod"}[e];n&&$inv.d.sync({Target:n,Value:t})},footer:function(e,t,n){let i=e.children("tfoot").empty();e.nextAll(".fnote").remove();let a=bool(n.p13b,!1),r=(e,t,n)=>$$.tdc("currency",$$.tr(i,{class:n||"tsum"}).append([$$.tdc("aux"),$$.td({colspan:4}).text(e)]),fnum(t,$rct.cst)),l=t=>$$.dc("fnote").insertAfter(e).rwText(t);r("Netto",t.total_net||0),!1===a&&$.each(t.vat||{},((e,t)=>r($rct.vat+" "+e+"%",t,"tvat"))),r("Summe",t.total_gross||0);let s=n.type||"";"i"===s?(l($rct.note2),l($rct.note4)):"c"===s?l($rct.note2):(l(string($rct.note3,[fnum(((t.service_net||0)+(t.service_vat||0))*(n.tax_servicerefund||0),$rct.cst)])).aC("ntax"),l($rct.note2),l(string($rct.note1,[fnum((t.service_net||0)+(t.service_vat||0),$rct.cst),fnum(t.service_net||0,$rct.cst),fnum(t.service_vat||0,$rct.cst)]))),!0===a&&l($rct.note13b)},validation:function(e){let t=$("div.invoice_layout");if(t.length<1)return;let n=t.children(".dvalidation");n.length<1&&(n=$$.dc("dvalidation"),t.prepend(n)),n.empty().tC("hidden",(e||[]).length<1),$.each(e||[],((e,t)=>$$.dc("dvmsg",n).aC(t.severity).text(t.message)))},preview:function(){let e=$inv.d.token();if(""===e)return;let t=$inv.d.layout(),n=($inv.d.tbl().data("new")||{}).invoiceemail||"";!1===$fis.ValidateEmail(n)&&!1===bool(confirm($ict.ivE+$ict.ivEc),!1)||(t.aC("freeze"),$ocms.postXT({url:$ocms.url("inv/dpreview"),data:{token:e},timeout:$inv.pdfPreviewTimeout,success:n=>{t.rC("freeze");let i=$$.dc("imagecollection pdfpreview"),a=Math.round(.88*vh()),r=n.total;r>10&&$$.dc("note warn",i).text($ict.tpe);let l=null;if(""!==(n.backdate||"")){let e=$("").addClass("backdate").attr("title",$ict.bdTT).appendTo(i);l=$('').appendTo(e),$$.s(string($ict.bdLbl,[n.backdate.split("-").reverse().join(".")])).appendTo(e)}$.each(n.img||[],((e,t)=>{$$.dc("pdfp",i).append($$.img(t).css("max-height",(a-rpx(6)).toString()+"px"))}));for(let e=(n.img||[]).length+1;e<=r;e++)$$.dc("pdfp ph",i).append($$.dc("note",$ict.pna));$ocms.dlg(i,{size:[a,Math.round(.88*vw())],zindex:50,form:!1,button:$rct.crI,confirm:function(n){let i=$(this);t.aC("freeze"),$ocms.postXT({url:$ocms.url("inv/dsave"),data:{token:e},success:e=>{$ocms.postXT({url:$ocms.url("req/sconf"),data:{id:e.invid,backdate:l&&l.is(":checked")?1:0},success:t=>{i.trigger("modal_close"),!0===t.hasFile&&window.open($ocms.url("req/idoc")+"?id="+e.invid,"_blank"),$inv.d.close(),$ocms.init("req"),$inv.rReload()},error:()=>{alert($t.f1),i.trigger("modal_close")},complete:()=>{t.rC("freeze")}})},error:()=>{t.rC("freeze"),alert($ict.eis)}})},cancel:function(e){confirm($ict.cdI)&&($inv.d.close(),$inv.rReload())}})},error:$inv.pdfPreviewFailed,complete:$inv.pdfPreviewComplete(t)}))},save:function(){let e=$inv.d.token();if(""===e)return;let t=$inv.d.layout();t.aC("freeze"),$ocms.postXT({url:$ocms.url("inv/dsave"),data:{token:e},success:e=>{$inv.d.tbl().data("invid",e.invid)},error:()=>{alert($ict.eis)},complete:()=>{t.rC("freeze")}})},history:function(){let e=$inv.d.token();""!==e&&$ocms.postXT({url:$ocms.url("inv/dhistory"),data:{token:e},success:e=>{let t=$$.dc("dhist");if((e.history||[]).length<1)$$.dc("note",t).text("Noch keine Änderungen erfasst.");else{let n=$$.tblset({class:"invtbl fullwidth"},t);$$.tr(n.hd).append([$$.th().text("Zeit"),$$.th().text("Feld"),$$.th().text("Alt"),$$.th().text("Neu")]),$.each(e.history,((e,t)=>$$.tr(n.bdy).append([$$.tdc("keep",fdt(t.timestamp)),$$.td().text(t.target),$$.td().text(t.oldValue),$$.td().text(t.newValue)])))}$ocms.dlg(t,{width:800,form:!1})}})},discard:function(){let e=$inv.d.tbl().data("invid")||"";""!==e?!1!==confirm("Alle Änderungen verwerfen und den zuletzt gespeicherten Stand neu laden?")&&($inv.d.close(),$inv.cntInv({id:e})):alert("Es wurde noch kein Zwischenstand gespeichert, der wiederhergestellt werden könnte.")},warnExpiry:function(e){let t=Math.max(1,Math.round((e||0)/60));$fis.notifications.push({severity:"info",title:"Entwurf läuft ab",message:"Der Rechnungsentwurf läuft in etwa "+t+" Minute(n) ab. Bitte zwischenspeichern, sonst gehen die Änderungen verloren."})},closed:function(e){let t=$inv.d.token();$inv.d.tbl().removeData("dtoken"),""!==t&&$fis.draft.release(t),$fis.frm_edit().remove(),$fis.lf(!0),$fis.notifications.push({severity:"error",title:"Entwurf geschlossen",message:"expired"===e?"Der Rechnungsentwurf ist wegen Inaktivität abgelaufen. Nicht gespeicherte Änderungen sind verloren.":"Der Rechnungsentwurf wurde geschlossen."});try{$inv.rReload()}catch(e){}},close:function(){let e=$inv.d.token();""!==e&&($ocms.postXT({url:$ocms.url("inv/dclose"),data:{token:e}}),$fis.draft.release(e)),$inv.d.tbl().removeData("dtoken")}},$inv.rd={tbl:()=>$("div.invoice_layout table.invi"),layout:()=>$("div.invoice_layout"),token:function(){return $inv.rd.tbl().data("rdtoken")||""},seed:function(e){let t=$inv.rd.layout();t.aC("freeze"),$ocms.postXT({url:$ocms.url("rem/dopen"),data:{payload:JSON.stringify(e)},success:e=>{$inv.rd.tbl().data("rdtoken",e.token).data("rdver",e.version),$fis.draft.bind(e.token,{onReady:()=>$inv.rd.refresh(),onExpiring:e=>$inv.rd.warnExpiry(e),onClosed:e=>$inv.rd.closed(e)}),$inv.rd.refresh()},error:()=>{t.rC("freeze")}})},refresh:function(e){let t=$inv.rd.token();""!==t&&$ocms.postXT({url:$ocms.url("rem/dstate"),data:{token:t},success:t=>{$inv.rd.applyState(t),"function"==typeof e&&e(t)},error:e=>{e&&410===e.status&&$inv.rd.closed("expired")},complete:()=>{$inv.rd.layout().rC("freeze")}})},applyState:function(e){let t=$inv.rd.tbl();if(t.length<1)return;let n=t.data("rdver");"number"==typeof n&&"number"==typeof e.version&&e.version{let t=$$[0]("p").aC("dnote intro").rwText(e);a.length?t.insertBefore(a):t.appendTo(n)})),((e||{}).closing||[]).forEach((e=>$$[0]("p").aC("dnote closing").rwText(e).appendTo(n)))},sync:function(e){let t=$inv.rd.token();""!==t&&($inv.rd.layout().aC("freeze"),$ocms.postXT({url:$ocms.url("rem/dpatch"),data:{token:t,delta:JSON.stringify(e)},success:()=>{$inv.rd.refresh()},error:e=>{$inv.rd.layout().rC("freeze"),e&&410===e.status&&$inv.rd.closed("expired")}}))},syncField:function(e,t){if(""===$inv.rd.token())return;let n={subject:"subject",invoiceaddress:"address",invoiceemail:"email",text:"text"}[e];n&&$inv.rd.sync({Target:n,Value:t})},syncAmount:function(e,t){""!==$inv.rd.token()&&($inv.rd.sync({Target:"amount",Value:(null!=e?e:0).toString()}),$inv.rd.sync({Target:"amount_payed",Value:(null!=t?t:0).toString()}))},footer:function(e,t){let n=e.children("tfoot").empty(),i=$$.tr(n,{class:"tsum"}).append([$$.tdc("aux"),$$.td({colspan:4}).text("Offener Betrag")]);$$.tdc("currency",i,fnum(t.amount_open||0,$rct.cst))},validation:function(e){let t=$inv.rd.layout();if(t.length<1)return;let n=t.children(".dvalidation");n.length<1&&(n=$$.dc("dvalidation"),t.prepend(n)),n.empty().tC("hidden",(e||[]).length<1),$.each(e||[],((e,t)=>$$.dc("dvmsg",n).aC(t.severity).text(t.message)))},preview:function(){let e=$inv.rd.token();if(""===e)return;let t=$inv.rd.layout(),n=($inv.rd.tbl().data("new")||{}).invoiceemail||"";!1===$fis.ValidateEmail(n)&&!1===bool(confirm($ict.ivE+$ict.ivEc),!1)||(t.aC("freeze"),$ocms.postXT({url:$ocms.url("rem/dpreview"),data:{token:e},timeout:$inv.pdfPreviewTimeout,success:n=>{t.rC("freeze");let i=$$.dc("imagecollection pdfpreview"),a=Math.round(.88*vh());$.each(n.img||[],((e,t)=>{$$.dc("pdfp",i).append($$.img(t).css("max-height",(a-rpx(6)).toString()+"px"))})),$ocms.dlg(i,{size:[a,Math.round(.88*vw())],zindex:50,form:!1,button:$ict.remd,confirm:function(n){let i=$(this);t.aC("freeze"),$ocms.postXT({url:$ocms.url("rem/dsave"),data:{token:e},success:e=>{$ocms.postXT({url:$ocms.url("rem/conf"),data:{id:e.remid},success:()=>{i.trigger("modal_close"),window.open($ocms.url("rem/idoc")+"?id="+e.remid,"_blank"),$inv.rd.close(),$ocms.init("req"),$inv.rReload()},error:()=>{alert($t.f1),i.trigger("modal_close")},complete:()=>{t.rC("freeze")}})},error:()=>{t.rC("freeze"),alert($t.f1)}})},cancel:function(e){confirm($ict.cdI)&&($inv.rd.close(),$inv.rReload())}})},error:$inv.pdfPreviewFailed,complete:$inv.pdfPreviewComplete(t)}))},save:function(){let e=$inv.rd.token();if(""===e)return;let t=$inv.rd.layout();t.aC("freeze"),$ocms.postXT({url:$ocms.url("rem/dsave"),data:{token:e},success:e=>{$inv.rd.tbl().data("remid",e.remid)},error:()=>{alert($t.f1)},complete:()=>{t.rC("freeze")}})},history:function(){let e=$inv.rd.token();""!==e&&$ocms.postXT({url:$ocms.url("rem/dhistory"),data:{token:e},success:e=>{let t=$$.dc("dhist");if((e.history||[]).length<1)$$.dc("note",t).text("Noch keine Änderungen erfasst.");else{let n=$$.tblset({class:"invtbl fullwidth"},t);$$.tr(n.hd).append([$$.th().text("Zeit"),$$.th().text("Feld"),$$.th().text("Alt"),$$.th().text("Neu")]),$.each(e.history,((e,t)=>$$.tr(n.bdy).append([$$.tdc("keep",fdt(t.timestamp)),$$.td().text(t.target),$$.td().text(t.oldValue),$$.td().text(t.newValue)])))}$ocms.dlg(t,{width:800,form:!1})}})},warnExpiry:function(e){let t=Math.max(1,Math.round((e||0)/60));$fis.notifications.push({severity:"info",title:"Entwurf läuft ab",message:"Der Mahnentwurf läuft in etwa "+t+" Minute(n) ab. Bitte zwischenspeichern, sonst gehen die Änderungen verloren."})},closed:function(e){let t=$inv.rd.token();$inv.rd.tbl().removeData("rdtoken"),""!==t&&$fis.draft.release(t),$fis.frm_edit().remove(),$fis.lf(!0),$fis.notifications.push({severity:"error",title:"Entwurf geschlossen",message:"expired"===e?"Der Mahnentwurf ist wegen Inaktivität abgelaufen. Nicht gespeicherte Änderungen sind verloren.":"Der Mahnentwurf wurde geschlossen."});try{$inv.rReload()}catch(e){}},close:function(){let e=$inv.rd.token();""!==e&&($ocms.postXT({url:$ocms.url("rem/dclose"),data:{token:e}}),$fis.draft.release(e)),$inv.rd.tbl().removeData("rdtoken")}},$inv.cInv2=function(e){let t=$$.dc("rfrm").ldng(1),n=$ocms.dlg(t,{width:1e3});n&&n.ft.rwText($rct.rq1);let i=()=>{$ocms.postXT({url:$ocms.url("req/get"),timeout:60,data:{id:e.id,mode:"r"},success:t=>{t.admin=t.admin||{};let n=$fis.lf(!0).aC("fix").rC("hd");if($fis.frm_edit().IN(),$inv.eM(!0,!0),(t.requests||[]).length<1)n.aC("fix").text($rct.nd);else{$$.dc("lh",n,$rct.mdl);let i=$$.d(),a=$$.ul({class:"rql"}).data({search:e.id,parent:t.admin.parent}).appendTo(n),r={},l=$rcol.req.lbl();$.each(t.requests||[],(function(e,t){let n=$$.li({class:"cli rli"}).data($.extend({},t)).appendTo(a),s=$$.dc("lihd",n).addClass(t.state);!0===booln(t.open,!1)&&s.append($$.sc("cbox").click((()=>{n.tC("checked"),i.find("li").rC("checked"),!0===n.is(".checked")?$inv.rMn(t.open):$inv.eM(!0)}))),s.append([$$.sc("eid",t.ExternalId),$$.sc("nme",t.Name)]),$$.dc("lidt",n).append([$$.dc("rqs").append([$$.s(l.State+": "),$$.s($rct.sts[t.State||"-"])]),$$.dc("ivn").append([$$.s(l.InvoiceId+": "),$$.s(t.InvoiceId||"- -")]),$$.dc("wda").append([$$.s(l.WorkDoneAt+": "),$$.s(fdt(t.WorkDoneAt,"dd.MM.yyyy"))])]),r[t.Id]=n})),(t.inv||[]).length>0&&($$.dc("lh",n,$rct.invs),i=$$.ul({class:"ivl"}).appendTo(n),$.each(t.inv||[],((e,t)=>{let n=$$.li({class:"cli ili"}).data($.extend({},t)).appendTo(i),r=$$.dc("lihd",n).addClass(t.invstatus);!1===booln(t.isFinal,!0)?r.append($$.sc("cbox").click((()=>{""!==(t.Id||"")&&(n.tC("checked").siblings().rC("checked"),a.find("li").rC("checked"),!0===n.is(".checked")?$inv.iMnr(t):$inv.eM(!0))}))):["","dft"].indexOf(t.invstatus)<0&&r.append($$.sc("dli").click((function(){$inv.disp(t.Id,"inv")}))),r.append($$.sc("nme",t.DocumentName||t.Id)),$$.dc("lidt",n).append([$$.dc("wda").append([$$.s(fdt(t.InvoiceDate||t.DateCreated,"dd.MM.yyyy"))]),$$.d().text($ict.iSt[t.invstatus]||t.invstatus)])})))}},complete:()=>{n&&n.c.trigger("modal_close")}})};$ocms.postXT({url:$ocms.url("req/pget"),timeout:90,data:{id:e.id},success:e=>{n&&n.ft.rwText($rct.rq2),i()},error:()=>{confirm($rct.rq1f)?(n&&n.ft.rwText($rct.rq2),i()):n&&n.c.trigger("modal_close")}})},$inv.ccInv=function(e){let t=(e.data||{}).typ||"r",n=$fis.lf(),i=n.children("ul.rql"),a=i.data("parent"),r=[];if(i.find("li.rli.checked").each((function(){r.push($(this).data("Id"))})),r.length<1)return void alert($rct.dnS);if("i"===t&&r.length>1)return void alert($rct.dII);let l=$fis.frm_edit(),s=$$.dc("invoice_layout",l).append($$.dc("btn sprev").click($inv.sprev)),d=$fis.cf().width()>s.width()+n.width()+20;n.tC("fix",d).tC("hd",!d),$inv.eM(!1,!0);let c=$$.dc("rfrm").ldng(1),o=$ocms.dlg(c,{width:1e3});o.ft.rwText($rct.rq2),$ocms.postXT({url:$ocms.url("req/iget"),timeout:60,data:{id:a,mode:"ful",typ:t,sel:r.join(",")},success:e=>{let t=$$.dc("srq",s),n=$$.tblset({class:"invi"},t);n.bdy.remove(),n.ft=$$[0]("tfoot"),e.admin=e.admin||{},e.admin.p13b=bool(e.admin.p13b||"",!0===((e.inv||{}).InvoiceOptions||"").split(",").includes("§13b")),n.tbl.data($.extend({new:{},sms:{},itm:{}},{admin:e.admin,companies:e.companies,locations:e.locations}));let i=$$.tr(n.hd).aC("shd").append([$$.th().aC("aux")]);$rct.invHR.forEach((e=>$$.th(i,e))),n.tbl.on("fds.inv",$inv.invSumUpdate),$.each(e.requests||[],(function(t,i){if(0!==(i.Id||0)){let t=$inv.worknotes(i);i.text="i"===e.admin.type?$rct.req+jine([i.ExternalId,i.Name],": ").eine(" ",""):jine([jine([fdt(i.WorkDoneAt,"dd.MM.yy"),i.ExternalId]," - "+$rct.req+" "),t.ne(i.Name)],": \n");let a=$$.tbody(n.tbl).data($.extend({},i));$inv.rendersrq.call(a)}}));let a=$$.tr($$.tbody(n.tbl),{class:"placeholder"}).data({net_val:0,vat_val:0,svcnet_val:0,svcvat_val:0,net:0});$inv.rrw.call(a),n.ft.appendTo(n.tbl);let r,l,d=e.admin||{},c=(e,t,i,a,r)=>{let l=$$.dc("inpfrm",s).aC(e).append("string"==typeof a?$$.dc("ahd",a):a>0?$$.dc("ahd",$rct.frm[i]):null),d=$$.dc("content",l).rwText(t);$$.dc("axf",l).append($$.dc("ibtn edit",{title:$rct.frmTT[i]||$rct.frm[i]}).data("dialog",$rct.frm[i]).append(gi("pencil")).click($.extend({t:d,nme:i,change:e=>{n.tbl.data("new")[i]=e}},r),$inv.eHtml)),n.tbl.data("new")[i]=t};c("tfrm",d.invoicetitle,"invoicetitle",0,null),c("adrfrm",d.invoiceaddress,"invoiceaddress",0,null),c("locfrm","","loc",1,{list:deepCopy(e.locations),lbl:"ref",property:"address"}),$inv.emailFrm(s,n,d.invoiceemail,d.invoiceemailcc),$$.dc("sndfrm",s).append($$.dc("content").text(d.sender)),d.provisionend&&(l=d.provisionstart?$rct.provP:$rct.provD,r=d.provisionstart?fdt(d.provisionstart,"dd.MM.yyyy")+" - "+fdt(d.provisionend,"dd.MM.yyyy"):fdt(d.provisionend,"dd.MM.yyyy")),c("admfrm",r,"provisionperiod",l,1),n.tbl.data("new").CustomValues=d.CustomValues||"",$$.dc("inpfrm ctpfrm",s).text(jObj(d.CustomValues,"contactName")),n.tbl.children("tbody").each($inv.bdysort),n.tbl.trigger("fds.inv"),$inv.eM(!1,!0,$inv.emOpt())},complete:()=>{o.c.trigger("modal_close")}})},$inv.ccStInv=function(e){let t=e.data||{},n=$fis.lf(),i=t.id,a=$$.dc("invoice_layout",$fis.frm_edit()).append($$.dc("btn sprev").click($inv.sprev)),r=$fis.cf().width()>a.width()+n.width()+20;n.tC("fix",r).tC("hd",!r),$inv.eM(!1,!0);let l=$$.dc("rfrm").ldng(1),s=$ocms.dlg(l,{width:1e3});s.ft.rwText($ict.iq1),$ocms.postXT({url:$ocms.url("inv/pget"),timeout:90,data:{id:t.id},success:e=>{s&&s.ft.rwText($ict.iq2),$ocms.postXT({url:$ocms.url("inv/icget"),timeout:60,data:{id:i},success:e=>{let t=$$.dc("srq",a),n=$$.tblset({class:"invi"},t);n.bdy.remove(),n.ft=$$[0]("tfoot"),e.admin=e.admin||{},e.admin.p13b=bool(e.admin.p13b||"",!0===((e.inv||{}).InvoiceOptions||"").split(",").includes("§13b")),n.tbl.data($.extend({new:{},sms:{},itm:{}},{admin:e.admin,companies:e.companies,locations:e.locations}));let i=$$.tr(n.hd).aC("shd").append([$$.th().aC("aux")]);$rct.invHR.forEach((e=>$$.th(i,e))),n.tbl.on("fds.inv",$inv.invSumUpdate),$.each(e.requests||[],(function(t,i){if(0!==(i.Id||0)){let t=$inv.worknotes(i);i.text="i"===e.admin.type?$rct.req+jine([i.ExternalId,i.Name],": ").eine(" ",""):jine([fdt(i.WorkDoneAt,"dd.MM.yy")+t.ne(i.Name)],": ");let a=$$.tbody(n.tbl).data($.extend({},i));$inv.rendersrq.call(a)}}));let r=$$.tr($$.tbody(n.tbl),{class:"placeholder"}).data({net_val:0,vat_val:0,svcnet_val:0,svcvat_val:0,net:0});$inv.rrw.call(r),n.ft.appendTo(n.tbl);let l,s,d=e.admin||{},c=(e,t,i,r,l)=>{let s=$$.dc("inpfrm",a).aC(e).append("string"==typeof r?$$.dc("ahd",r):r>0?$$.dc("ahd",$rct.frm[i]):null),d=$$.dc("content",s).rwText(t);$$.dc("axf",s).append($$.dc("ibtn edit",{title:$rct.frmTT[i]||$rct.frm[i]}).data("dialog",$rct.frm[i]).append(gi("pencil")).click($.extend({t:d,nme:i,change:e=>{n.tbl.data("new")[i]=e}},l),$inv.eHtml)),n.tbl.data("new")[i]=t};c("tfrm",d.invoicetitle,"invoicetitle",0,null),c("adrfrm",d.invoiceaddress,"invoiceaddress",0,null),c("locfrm",d.provisionlocation,"loc",1,{list:deepCopy(e.locations),lbl:"ref",property:"address"}),$inv.emailFrm(a,n,d.invoiceemail,d.invoiceemailcc),$$.dc("sndfrm",a).append($$.dc("content").text(d.sender)),d.provisionend&&(s=d.provisionstart?$rct.provP:$rct.provD,l=d.provisionstart?fdt(d.provisionstart,"dd.MM.yyyy")+" - "+fdt(d.provisionend,"dd.MM.yyyy"):fdt(d.provisionend,"dd.MM.yyyy")),c("admfrm",l,"provisionperiod",s,1),n.tbl.data("new").CustomValues=d.CustomValues||"",$$.dc("inpfrm ctpfrm",a).text(jObj(d.CustomValues,"contactName")),n.tbl.children("tbody").each($inv.bdysort),n.tbl.trigger("fds.inv")},error:e=>{alert($t.f1+(e&&e.status?e.status:""))},complete:()=>{s.c.trigger("modal_close")}})},error:e=>{s&&s.c.trigger("modal_close"),alert($t.f1+(e&&e.status?e.status:""))}})},$inv.clCntInv=function(e){let t=$fis.lf(!1),n=[];t.find("li.ili.checked").each((function(){n.push($(this).data("Id"))})),1===n.length&&$inv.cntInv({id:n[0]})},$inv.cntInv=function(e){e=e||{};$fis.lf(!1).rC("fix").aC("hd");let t=$$.dc("invoice_layout",$fis.frm_edit()).append($$.dc("btn sprev").click($inv.sedit));$inv.eM(!1,!0);let n=$$.dc("rfrm").ldng(1),i=$ocms.dlg(n,{width:1e3});i.ft.rwText($rct.rq2),$ocms.postXT({url:$ocms.url("inv/get"),timeout:60,data:{id:e.id},success:e=>{e.admin=e.admin||{};let n=e.inv||{},i=$$.dc("srq",t),a=$$.tblset({class:"invi"},i);a.bdy.remove(),a.ft=$$[0]("tfoot"),a.tbl.data($.extend({invid:n.Id,new:{},sms:{},itm:{},bai:[]},e));let r=$$.tr(a.hd).aC("shd").append([$$.th().aC("aux")]);$rct.invHR.forEach((e=>$$.th(r,e))),a.tbl.on("fds.inv",$inv.invSumUpdate),$.each(e.req||[],(function(e,t){let n=$$.tbody(a.tbl).data($.extend({},t));$inv.rendersrq.call(n)}));let l=$$.tr($$.tbody(a.tbl),{class:"placeholder"}).data({net_val:0,vat_val:0,svcnet_val:0,svcvat_val:0,net:0});$inv.rrw.call(l),a.ft.appendTo(a.tbl);let s=(e,n,i,r,l)=>{let s=$$.dc("inpfrm",t).aC(e).append("string"==typeof r?$$.dc("ahd",r):r>0?$$.dc("ahd",$rct.frm[i]):null),d=$$.dc("content",s).rwText(n);$$.dc("axf",s).append($$.dc("ibtn edit",{title:$rct.frmTT[i]||$rct.frm[i]}).data("dialog",$rct.frm[i]).append(gi("pencil")).click($.extend({t:d,nme:i,change:e=>{a.tbl.data("new")[i]=e}},l),$inv.eHtml)),a.tbl.data("new")[i]=n};s("tfrm",n.InvoiceTitle,"invoicetitle",0,null),s("adrfrm",n.SendToAddress,"invoiceaddress",0,null),s("locfrm",n.ProvisionLocation,"loc",1,null),$inv.emailFrm(t,a,n.SendToEmail,n.SendToEmailCc),$$.dc("sndfrm",t).append($$.dc("content").text(e.admin.sender)),s("admfrm",n.ProvisionPeriod,"provisionperiod",!0===(n.ProvisionPeriod||"").includes("-")?$rct.provP:$rct.provD,1),a.tbl.data("new").CustomValues=n.CustomValues||"",$$.dc("inpfrm ctpfrm",t).text(jObj(n.CustomValues,"contactName")),a.tbl.children("tbody").each($inv.bdysort),a.tbl.trigger("fds.inv"),$inv.eM(!1,!0,$inv.emOpt())},complete:()=>{i.c.trigger("modal_close")}})},$inv.cSt=function(e){e=e||{};let t=$fis.lf(),n=$$.dc("invoice_layout",$fis.frm_edit()).append($$.dc("btn sprev").click($inv.sedit)),i=$fis.cf().width()>n.width()+t.width()+20;t.tC("fix",i).tC("hd",!i),$inv.eM(!1,!0);let a=$$.dc("rfrm").ldng(1),r=$ocms.dlg(a,{width:1e3});r.ft.rwText($ict.iq1),$ocms.postXT({url:$ocms.url("inv/pget"),data:{id:e.id},success:t=>{r&&r.ft.rwText($ict.iq2),$ocms.postXT({url:$ocms.url("inv/storno"),data:{id:e.id,mode:e.mode},success:e=>{e.admin=e.admin||{},e.admin.p13b=bool(e.admin.p13b||"",!0===((e.inv||{}).InvoiceOptions||"").split(",").includes("§13b"));let t=e.inv||{},i=$$.dc("srq",n),a=$$.tblset({class:"invi"},i);a.bdy.remove(),a.ft=$$[0]("tfoot"),a.tbl.data($.extend({invid:t.Id,new:{},sms:{},itm:{},bai:[]},e));let r=$$.tr(a.hd).aC("shd").append([$$.th().aC("aux")]);$rct.invHR.forEach((e=>$$.th(r,e))),a.tbl.on("fds.inv",$inv.invSumUpdate),$.each(e.req||[],(function(e,t){let n=$$.tbody(a.tbl).data($.extend({},t));$inv.rendersrq.call(n)}));let l=$$.tr($$.tbody(a.tbl),{class:"placeholder"}).data({net_val:0,vat_val:0,svcnet_val:0,svcvat_val:0,net:0});$inv.rrw.call(l),a.ft.appendTo(a.tbl);let s=(e,t,i,r,l)=>{let s=$$.dc("inpfrm",n).aC(e).append("string"==typeof r?$$.dc("ahd",r):r>0?$$.dc("ahd",$rct.frm[i]):null),d=$$.dc("content",s).rwText(t);$$.dc("axf",s).append($$.dc("ibtn edit",{title:$rct.frmTT[i]||$rct.frm[i]}).data("dialog",$rct.frm[i]).append(gi("pencil")).click($.extend({t:d,nme:i,change:e=>{a.tbl.data("new")[i]=e}},l),$inv.eHtml)),a.tbl.data("new")[i]=t};s("tfrm",t.InvoiceTitle,"invoicetitle",0,null),s("adrfrm",t.SendToAddress,"invoiceaddress",0,null),s("locfrm",t.ProvisionLocation,"loc",1,null),$inv.emailFrm(n,a,t.SendToEmail,t.SendToEmailCc),$$.dc("sndfrm",n).append($$.dc("content").text(e.admin.sender)),s("admfrm",t.ProvisionPeriod,"provisionperiod",!0===(t.ProvisionPeriod||"").includes("-")?$rct.provP:$rct.provD,1),a.tbl.data("new").CustomValues=t.CustomValues||"",$$.dc("inpfrm ctpfrm",n).text(jObj(t.CustomValues,"contactName")),a.tbl.children("tbody").each($inv.bdysort),a.tbl.trigger("fds.inv")},error:e=>{alert($t.f1+(e&&e.status?e.status:""))},complete:()=>{r.c.trigger("modal_close")}})},error:e=>{r&&r.c.trigger("modal_close"),alert($t.f1+(e&&e.status?e.status:""))}})},$inv.adrCountries=[["DE","Deutschland"],["AT","Österreich"],["CH","Schweiz"],["FR","Frankreich"],["NL","Niederlande"],["BE","Belgien"],["LU","Luxemburg"],["IT","Italien"],["ES","Spanien"],["PL","Polen"],["DK","Dänemark"],["CZ","Tschechien"],["GB","Großbritannien"],["US","USA"]],$inv.composeAddress=function(e){let t=[],n=e=>{""!==(e=(""+(e||"")).trim())&&t.push(e)};n((e=e||{}).name),""!==(""+(e.contact||"")).trim()&&n("z.Hd. "+(""+e.contact).trim()),n(e.line2||e.addressLine2),n(e.street),n(((e.postalCode||"")+" "+(e.city||"")).trim());let i=(""+(e.countryCode||"")).toUpperCase();return""!==i&&"DE"!==i&&n(i),t.join("\n")},$inv.adrCurrent=function(e){let t=jObj((e.data("new")||{}).CustomValues,"sendToAddress");if("string"==typeof t&&"{"===t.trim().charAt(0))try{t=JSON.parse(t)}catch(e){t=null}if(t&&"object"==typeof t)return t;let n=(e.data("admin")||{}).invoiceaddressData;if("string"==typeof n&&"{"===n.trim().charAt(0))try{return JSON.parse(n)}catch(e){}else if(n&&"object"==typeof n)return n;return{}},$inv.eAddress=function(e){let t=$inv.d.tbl(),n=$inv.adrCurrent(t),i=[{name:"name",label:"Name / Firma",type:"text",value:n.name||"",required:!0},{name:"contact",label:"z.Hd. (optional)",type:"text",value:n.contact||""},{name:"street",label:"Straße + Nr.",type:"text",value:n.street||""},{name:"line2",label:"Adresszusatz (optional)",type:"text",value:n.line2||n.addressLine2||""},{name:"postalCode",label:"PLZ",type:"text",value:n.postalCode||""},{name:"city",label:"Ort",type:"text",value:n.city||""},{name:"countryCode",label:"Land",type:"select",url:$inv.adrCountries,value:n.countryCode||"DE"},{name:"vatId",label:"USt-IdNr. (nur bei Firmen)",type:"text",value:n.vatId||""},{name:"leitwegId",label:"Leitweg-ID (nur Behörden / B2G)",type:"text",value:n.leitwegId||""}],a=$$.dc("adr-conformity").append([$$.dc("hd").text("Hinweis zur DATEV-/eRechnungs-Konformität"),$$.dc("tx").text("Pflicht: Name, Straße, PLZ, Ort und Land. Die USt-IdNr. nur bei Firmen angeben — für eine Rechnung an eine Privatperson einfach leer lassen. Eine Leitweg-ID nur bei Behörden (B2G) — dann wird die Rechnung automatisch als XRechnung erzeugt.")]);$ocms.dlgform(i,{title:"Rechnungsempfänger",addcontent:a,success:function(t){let n={name:t.name||"",contact:t.contact||"",line2:t.line2||"",street:t.street||"",postalCode:t.postalCode||"",city:t.city||"",countryCode:t.countryCode||"DE",vatId:(""+(t.vatId||"")).trim(),leitwegId:(""+(t.leitwegId||"")).trim()},i=$inv.composeAddress(n);e.data&&e.data.t&&e.data.t.rwText(i),"function"==typeof(e.data||{}).change&&e.data.change(i),$inv.d.sync({Target:"address",Value:n})}})},$inv.provToIso=function(e){let t=(""+(e||"")).match(/(\d{1,2})\.(\d{1,2})\.(\d{4})/);return t?t[3]+"-"+("0"+t[2]).slice(-2)+"-"+("0"+t[1]).slice(-2):""},$inv.eProvisionPeriod=function(e){let t=(""+(e.data&&e.data.t?e.data.t.text():"")).trim().match(/\d{1,2}\.\d{1,2}\.\d{4}/g)||[],n=[{name:"von",label:"Leistungsdatum",type:"date",value:$inv.provToIso(t[0]||"")},{name:"bis",label:"Leistungszeitraum – bis (optional)",type:"date",value:$inv.provToIso(t[1]||"")}],i=$$.dc("adr-conformity").append([$$.dc("hd").text("Leistungsdatum / -zeitraum"),$$.dc("tx").text('Für ein einzelnes Datum nur „Leistungsdatum" ausfüllen; für einen Zeitraum zusätzlich das Bis-Datum. Nur strukturierte Datumsauswahl — für die E-Rechnung empfohlen.')]);$ocms.dlgform(n,{title:"Leistungsdatum / -zeitraum",addcontent:i,success:function(t){let n=(""+(t.von||"")).trim(),i=(""+(t.bis||"")).trim(),a=""===n?"":""===i||i===n?n:n+" - "+i;e.data&&e.data.t&&e.data.t.rwText(a),"function"==typeof(e.data||{}).change&&e.data.change(a),$inv.d.sync({Target:"provisionperiod",Value:a})}})},$inv.eEmail=function(e){let t=[{name:"email",label:$rct.frm.invoiceemail,type:"text",value:(e.data.t||$$.s()).text()},{name:"emailcc",label:$rct.frm.invoiceemailcc,type:"text",value:(e.data.ccT||$$.s()).text()}];$ocms.dlgform(t,{title:$rct.frm.invoiceemail,success:function(t){let n=(""+(t.email||"")).trim(),i=(""+(t.emailcc||"")).trim();e.data&&e.data.t&&e.data.t.text(n),e.data&&e.data.ccT&&e.data.ccT.text(i),"function"==typeof(e.data||{}).change&&e.data.change(n),"function"==typeof(e.data||{}).changeCc&&e.data.changeCc(i),$inv.d.syncField("invoiceemail",n),$inv.rd.syncField("invoiceemail",n),$inv.d.syncField("invoiceemailcc",i),$inv.rd.syncField("invoiceemailcc",i)}})},$inv.emailFrm=function(e,t,n,i){let a=$$.dc("inpfrm emailccfrm",e),r=$$.dc("content",a).rwText(i),l=$$.dc("inpfrm emailfrm",e),s=$$.dc("content",l).rwText(n);$$.dc("axf",l).append($$.dc("ibtn edit",{title:$rct.frmTT.invoiceemail}).append(gi("pencil")).click({t:s,ccT:r,nme:"invoiceemail",change:e=>{t.tbl.data("new").invoiceemail=e},changeCc:e=>{t.tbl.data("new").invoiceemailcc=e}},$inv.eHtml)),t.tbl.data("new").invoiceemail=n,t.tbl.data("new").invoiceemailcc=i},$inv.eHtml=function(e){if(e.data&&!(e.data instanceof jQuery)&&$inv.d&&"function"==typeof $inv.d.token&&""!==$inv.d.token()){if("invoiceaddress"===e.data.nme)return $inv.eAddress.call(this,e);if("provisionperiod"===e.data.nme)return $inv.eProvisionPeriod.call(this,e)}if(e.data&&!(e.data instanceof jQuery)&&"invoiceemail"===e.data.nme&&e.data.ccT)return $inv.eEmail.call(this,e);let t=$(this),n=e.data instanceof jQuery?e.data:e.data.t,i=["invoiceemail","invoiceemailcc","provisionperiod","invoicetitle"].includes(e.data.nme),a=i?[{name:"txt",label:"Text",type:"text",value:n.text()}]:[{name:"txt",label:"Text",type:"html",value:n.html(),tinymce:!0,attr:{style:"height: 300px"}}],r=e.data.change||null,l={title:t.data("dialog")||"",success:function(t){i?n.text(t.txt||""):n.html(t.txt),"function"==typeof r&&r(t.txt),$inv.d.syncField(e.data.nme,i?t.txt||"":t.txt),$inv.rd.syncField(e.data.nme,i?t.txt||"":t.txt)},tinymce:{valid_elements:"br",hidemenu:!0,hidetoolbar:!0}};if(Array.isArray(e.data.list)){let t=$$.dc("lstfrm");$.each(e.data.list,((n,i)=>{let a=$$.dc("li",t).append(""!==(e.data.lbl||"")?$$.dc("lbl").rwText(i[e.data.lbl]):null);$$.dc("adr",a).rwText(i[e.data.property]).data("val",i[e.data.property]).click((function(){let e=$(this),t=e.closest(".modal-body").find(':input[name="txt"]');t.is(".tinymce")?tinymce.get(t.attr("id")).setContent($$.s().rwText(e.data("val")).html()):"TEXTAREA"===t.prop("tagName")?t.val(e.data("val")).change():t.rwText(e.data("val"))}))})),l.addcontent=t}$ocms.dlgform(a,l)},$inv.setVat=function(e){$(this);let t=e.data,n=prompt($rct.rqV);n&&(n=parseFloat(n.replace("%","")),n>1&&(n*=.01),!1===isNaN(n)&&(t.siblings(".itm").each((function(){$(this).data().vat=fnum(n,{style:"percent"}).replace(" ","")})),$inv.t_fds_inv()))},$inv.inRow=function(e){let t=$(this),n=e.data,i={},a=$rcol.itm.clone(["SortOrder","NameOrNumber","Type","quantityhours","UnitString","net","svcnet_val","svcvat_val","net_val","vat_val","vat","Note"]),r="N"+(65536*(1+Math.random())||0).toString(16).substr(6),l=$$.tr({id:"itm_"+r.toString(),class:"itm"});$ocms.dlgform(a,{title:t.data("dialog")||"",success:function(e){l.data($.extend({Id:r},i,e)),$inv.rrw.call(l),l.insertAfter(n),$inv.t_fds_inv()},typedvalues:!0})},$inv.eRow=function(e){let t=$(this),n=e.data,i=n.data()||{},a=["SortOrder","NameOrNumber","Type","quantityhours","UnitString","net","svcnet_val","svcvat_val","net_val","vat_val","vat","Note"];i.id||""!==(i.Type||"")||a.unshift("Type");let r=$rcol.itm.clone(a).applyValues(i);r.set("Type","hidden","type"),$inv.eRw.call(t,n,i,r)},$inv.eRw=function(e,t,n){let i=$(this);$ocms.dlgform(n,{title:i.data("dialog")||"",success:function(n){let i={};""===(t.Id||"")&&(i.Id="N"+(65536*(1+Math.random())||0).toString(16).substr(6),e.attr("id","itm_"+i.Id.toString())),i.quantity=((n.quantityhours||"").toString()+" "+(n.UnitString||"").toString()).trimEnd(),e.data($.extend({},t,n,i)),console.debug("eRw success %o",e.data()),$inv.rrw.call(e),$inv.t_fds_inv()},typedvalues:!0})},$inv.bdysort=(e,t)=>{$(t).Sortable({dragItem:!1,dragHandleClass:"ico",parentident:"tr",onend:()=>{$inv.t_fds_inv()}})},$inv.rowCtxMenu=function(e){let t=$$[0]("nav").aC("rowctx");return t.ocmsmenu([{glyph:"glyphicon-option-vertical",aclass:"ctxbtn",attr:{title:$rct.ctxM},itm:e}]),t.find("li[title]").each((function(){let e=$(this);e.children("a").attr("title",e.attr("title"))})),t},$inv.rrw=function(){let e=$(this),t=e.data(),n={},i=e.is(".placeholder"),a=e.is(".hidenote"),r=e=>$$.d().append(e).html(),l=[{lbl:$rct.iRb,attr:{title:$rct.iRb},data:e,fnc:$inv.inRow}];!1===i&&(l.unshift({lbl:$rct.cP,attr:{title:$rct.cP},data:e,fnc:$inv.eRow}),l.push({lbl:$rct.dR,attr:{title:$rct.dR},fnc:function(t){confirm($rct.cD)&&(e.remove(),$inv.t_fds_inv())}}),"set"===(t.Type||"").toLowerCase()&&0===(t.net_val||0)&&l.push({lbl:$rct.toSetP,attr:{title:$rct.toSetP},data:e,fnc:$inv.toSetPrice}));let s=$$.dc("axf").append($inv.rowCtxMenu(l));!0===i?n={id:"",typ:"placeholder"}:!0===e.is(".itm.osum")?n={invrqid:t.InvRqId,id:"osum"+e.index(),typ:"osum",p:"",q:null,t:r(t.tbl.tbl),tt:null,v:null,vt:t.net_val,vs:t.svcnet_val,vat:t.vat,vv:t.vat_val,vsv:t.svcvat_val,det:!1}:(n={invrqid:t.InvRqId,id:t.Id||"",typ:t.Type||"other",p:"",q:null,t:"",tt:null,v:null,vt:t.net_val,vs:t.svcnet_val,vat:t.vat,vv:t.vat_val,vsv:t.svcvat_val,det:""!==(t.Note||"")&&!1===a,SetItmId:t.SetItmId||null,lvl:t.lvl||0,ref:t.reference_InvId||null},$$.dc("ibtn ico move",s,{title:$rct.mR}),n.p=null!=t.position?t.position:t.SortOrder||"",""===n.id?n.t="":["Text","Title"].includes(n.typ)&&0===(t.net_val||0)?n.t=t.htmltext||("#"!==(t.NameOrNumber||"").substr(0,1)?r($$[0]("p").text(t.NameOrNumber)):"")+(t.Note||""):(n.tt=n.det?"":$$.s(t.Note||"").text(),n.q=t.quantity||(0!==(t.quantityhours||0)?fnum(t.quantityhours)+" "+(t.UnitString||""):""),n.t=t.htmltext||(n.det?r($$.s(t.NameOrNumber||""))+r($$.dc("desc").html(t.Note)):r($$.s(t.NameOrNumber||""))),n.v=t.net,n.vt=t.net_val)),""!==(t.Note||"")&&$$.dc("ibtn add",s,{title:$rct.noteToggle}).append(gi("object-align-left")).click((function(t){$inv.rrw.call(e.tC("hidenote"))}));let d=[$$.tdc("aux").append(s),$$.tdc("keep").text(n.p)];if(""===n.id)d.push($$.td(e,{colspan:4}).append(n.t));else{Array.prototype.push.apply(d,n.q?[$$.tdc("keep").text(n.q)]:[]);let e=e=>null==e?"":fnum(e,$rct.cst);Array.prototype.push.apply(d,[$$.tdc("txt",{colspan:n.q?1:2,title:n.tt}).append(n.t),$$.tdc("currency").text(e(n.v)),$$.tdc("currency inetval").text(e(n.vt)).attr("title",$rct.svcPart+": "+e(n.vs))])}e.empty().attr("class",i?"placeholder":"itm").aC(n.Typ).tC("sethdr","set"===(n.typ||"").toString().toLowerCase()).aC((n.lvl||0)>0?"lvl"+Math.min(n.lvl,6):"").tC("hidenote",a).append(d),t.co=n},$inv.toSetPrice=function(e){let t=(e.data.data().Id||"").toString();""!==t&&!1!==confirm($rct.toSetPc)&&$.when($inv.t_fds_inv()).done((()=>{$inv.d.sync({Target:"item.setprice",Ref:t})}))},$inv.invSumUpdate=function(){let e=$(this),t=[],n=e.children("tbody"),i=[];n.each(((e,n)=>{let a=$(n),r=a.data()||{},l=[],s=[],d=a.find("tr.itm");a.tC("empty",d.length<1),d.each(((e,t)=>{let n=$(t).data()||{};l.push(n.co);let a=$inv.itemToContract(n),r=(n.SetItmId||"").toString();""!==r&&r!==a.id&&(a.setId=r),s.push(a);let d=!1===["text","title"].includes((n.Type||"other").toLowerCase());n.position=((e,t)=>{if(!e)return"";let n=Math.max(t||0,0);for(;i.length<=n;)i.push(0);return i.length=n+1,i[n]++,i.join(".")})(d,(n.co||{}).lvl||0),$inv.rrw.call(t)})),t.push({Id:r.Id,nme:r.Name,text:r.text,itm:l,items:s})}));let a=e.find("tbody:not(.empty)").length;n.find("tr.isum").tC("hidden",a<2),e.data("bai",t),""===(e.data("dtoken")||"")&&!1===bool(e.data("dseeding"),!1)&&null!=(e.data("admin")||{}).type&&(e.data("dseeding",!0),$inv.d.seed($.extend($inv.invcPayload(e.data()),{invid:e.data("invid")||""})))},$inv.worknotes=function(e){let t="";return e.steps.forEach(((e,n)=>{let i;try{i=JSON.parse(e.Data||{}).fields||[]}catch(e){console.debug(e),i=[]}!0!==Array.isArray(i||"")&&(i="object"==typeof i&&!0===Array.isArray(i.field||"")?i.field:[]),i.forEach(((e,n)=>{"Ausgeführte Arbeiten"===e.name&&(t=e.result||"")}))})),t},$inv.rendersrq=function(){let e=$(this).empty(),t=e.is(".onesum"),n=e.data(),i=$$.tr(e,{id:"srq"+n.Id}).aC("title nosort"),a=($rcol.itm.lbl(),$$.dc("axf").appendTo($$.tdc("aux",i)));$$.dc("ibtn osum",a,{title:$rct.combP}).append(gi("euro")).click((function(t){e.tC("onesum"),$inv.rendersrq.call(e),$inv.t_fds_inv()})),$$.dc("ibtn setvat",a,{title:$rct.sV}).append(gi("gbp")).click(i,$inv.setVat),$$.dc("ibtn insb",a,{title:$rct.iRb}).append(gi("indent-left")).click(i,$inv.inRow);let r,l=$$.sc("text",n.text),s=($$.td(i,{colspan:t?4:5}).append(l),["net_val","vat_val","svcnet_val","svcvat_val","net"]);if($$.dc("ibtn edit",a,{title:$rct.sectionTitleEditTT}).data("dialog",$rcol.req.lbl().Name).append(gi("pencil")).click({t:l,change:e=>{n.text=e,$inv.t_fds_inv()}},$inv.eHtml),t&&($$.tdc("currency isumval",i),r={Id:n.Id.toString()+"_osum",net_val:0,vat_val:0,svcnet_val:0,svcvat_val:0,net:0},r.tbl=$$.tblset({class:"stbl"})),$.each(n.items||[],((n,i)=>{let a,l={Id:i.Id,net_val:i.net_val||0,vat_val:i.vat_val||0,svcnet_val:0,svcvat_val:0,net:i.net||0,Note:i.Note||""};if("service"===i.Type.toLowerCase())l.svcnet_val=i.net_val||0,l.svcvat_val=i.vat_val||0;t?(a=$$.tr(r.tbl.bdy,{id:"itm"+i.Id,class:"sitm"}).aC(i.Type),"Text"===i.Type||"Title"===i.Type?$$.td(a,{colspan:2}).html(i.htmltext||i.Note):($$.tdc("keep",a).text(i.quantity||((i.quantityhours||0)>0?fnum(i.quantityhours)+(i.UnitString||"").eine(" ",""):"")),i.htmltext?$$.tdc("txt",a).html(i.htmltext):$$.tdc("txt",a).text(i.NameOrNumber).attr("title",i.Note)),$.each(s,((e,t)=>{r[t]+=l[t]})),a.data(l)):($.extend(l,i),a=$$.tr(e,{id:"itm"+i.Id,class:"itm"}),a.data(l),$inv.rrw.call(a))})),t){let t=$$.tr(e,{id:"itmsq"+n.Id,class:"itm osum"}).data(r);$inv.rrw.call(t)}else{let t=$$.tr(e).aC("isum nosort");$$.tdc("aux",t),$$.td(t,{colspan:4}).text($rct.iSum),$$.tdc("currency isumval",t)}},$inv.t_fds_inv=()=>{let e=$("div.invoice_layout table.invi");if(e.trigger("fds.inv"),""!==(e.data("dtoken")||""))return $inv.d.syncChanged(e);let t=e.data("dseedpromise");return t?$.when(t).then((()=>$inv.d.syncChanged(e))):$.when()},$inv.sedit=()=>{$inv.sprev(!0)},$inv.jdisp=function(e){e.stopPropagation(),e.data.id&&$inv.disp(e.data.id,e.data.typ||"")},$inv.disp=(e,t)=>{let n="";switch(t){case"inv":n="inv/rdoc";break;case"rem":n="rem/rdoc"}if(""!==n){let t=$inv.pdfWaitDlg();$ocms.postXT({url:$ocms.url(n),data:{id:e||"",typ:"img"},timeout:$inv.pdfPreviewTimeout,success:e=>{let t=$$.dc("imagecollection pdfpreview"),n=Math.round(.88*vh());e.id;$.each(e.img||[],(function(e,i){$$.dc("pdfp",t).append($$.img(i).css("max-height",(n-rpx(6)).toString()+"px"))})),$ocms.dlg(t,{size:[n,Math.round(.88*vw())],zindex_min:50,form:!1,exclusive:!1})},error:$inv.pdfPreviewFailed,complete:$inv.pdfPreviewComplete(null,t)})}},$inv.jdbn=function(e){let t=$inv.pdfWaitDlg();$ocms.postXT({url:$ocms.url("inv/rdocn"),data:{name:e.data.id||"",typ:"img"},timeout:$inv.pdfPreviewTimeout,success:e=>{let t=$$.dc("imagecollection pdfpreview"),n=Math.round(.88*vh());e.id;$.each(e.img||[],(function(e,i){$$.dc("pdfp",t).append($$.img(i).css("max-height",(n-rpx(6)).toString()+"px"))})),$ocms.dlg(t,{size:[n,Math.round(.88*vw())],zindex:50,form:!1})},error:$inv.pdfPreviewFailed,complete:$inv.pdfPreviewComplete(null,t)})},$inv.sp13b=()=>{var e=$("div.invoice_layout").find("table.invi"),t=e.data();t.admin.p13b=!0,!1===(t.inv.InvoiceOptions||"").split(",").includes("§13b")&&(t.inv.InvoiceOptions+=",§13b"),e.trigger("fds.inv"),$inv.d.sync({Target:"p13b",Value:t.admin.p13b})},$inv.itemToContract=function(e){let t=((e=e||{}).Type||"").toString().toLowerCase(),n=e=>e??null,i={id:(e.Id||"").toString(),type:t,title:"",desc:"",qty:"",price_net:"",total_net:n(e.net_val),vat:e.vat||""};var a;return e.co&&"osum"===e.co.typ?(i.desc=e.co.t||"",i.total_net=e.net_val||0):["text","title"].includes(t)&&0===(e.net_val||0)?(i.desc=e.htmltext||("#"!==(e.NameOrNumber||"").substr(0,1)?(a=$$[0]("p").text(e.NameOrNumber||""),$$.d().append(a).html()):"")+(e.Note||""),i.total_net=""):(e.htmltext?i.desc=e.htmltext:(i.title=e.NameOrNumber||"",i.desc=e.Note||""),i.qty=e.quantity||(0!==(e.quantityhours||0)?fnum(e.quantityhours)+(e.UnitString?" "+e.UnitString:""):""),i.price_net=n(e.net),i.total_net=n(e.net_val)),i},$inv.hasSets=e=>((e||{}).req||[]).some((e=>{let t=((e||{}).itm||[]).filter((e=>e&&""!==(e.id||""))),n={};t.forEach((e=>{n[(e.id||"").toString()]=e}));return t.some((e=>{let t=(null==e.SetItmId?"":e.SetItmId).toString();return""!==t&&t!==(e.id||"").toString()&&n[t]&&(e=>"set"===(e.typ||"").toString().toLowerCase())(n[t])}))})),$inv.ssetmode=()=>{let e,t=$("div.invoice_layout").find("table.invi").data();if(t.dstate&&!1===$inv.hasSets(t.dstate))return void alert($rct.toSetMn);let n=t=>$$.dc("btn",$ict.setmo[t]).click((()=>{e.c.trigger("modal_close"),$inv.setSetmode(t)})),i=$$.dc("choicefrm").append([n("setprice"),n("setonly")]);e=$ocms.dlg(i,{width:800})},$inv.setSetmode=e=>{if(!1===confirm($rct.toSetMc||$rct.toSetPc))return;let t="setonly"===e?"block.setonly":"block.setprice";$.when($inv.t_fds_inv()).done((()=>{$inv.d.sync({Target:t})}))},$inv.sctp=()=>{let e=$invcol.ctp;$ocms.dlgform(e,{title:$ict.ctp,success:function(e){var t=$("div.invoice_layout"),n=t.find("table.invi").data();let i={};void 0!==n.new&&"{"===(n.new.CustomValues||"").substr(0,1)&&(i=JSON.parse(n.inv.CustomValues)),i.contactName=e.name,i.contactEmail=e.email,n.new.CustomValues=JSON.stringify(i),t.find(".ctpfrm").text(ne(e.name,e.email)),$inv.d.sync({Target:"contact",Value:{name:e.name,email:e.email}})},typedvalues:!0})},$inv.invcPayload=function(e){e=e||{};let t=$.extend({},e.new),n=$.extend({},e.admin);return t.title=null!=t.invoicetitle?t.invoicetitle:t.title||"",t.provisionlocation=null!=t.loc?t.loc:t.provisionlocation||"",t.paymentterm=null!=n.paymentterms?n.paymentterms:t.paymentterm||"",n.customerid=null!=n.customerid?n.customerid:n.CustomerId,{admin:n,req:e.bai,new:t}},$inv.ssave=()=>{$inv.d.save()},$inv.sprev=e=>{$inv.d.preview()},$inv.rReload=()=>{try{let e=$("#listframe ul.rql:first").data();$inv.cInv2({id:e.search})}catch(e){}},$inv.quantChange=function(e){},$inv.storno=function(e,t){let n,i=$$.dc("choicefrm").append([$$.dc("btn","Storno ohne Details").click({id:e,mode:"simple"},(e=>{n.c.trigger("modal_close"),$inv.cSt(e.data)})),$$.dc("btn","Storno mit neuer Rechnung").click({id:e},(e=>{n.c.trigger("modal_close"),$inv.ccStInv(e)})),$$.dc("btn","Storno mit best. Rechnung").tC("inactive",!1===bool(t,!1)).click({id:e,mode:"copy"},(e=>{!0===bool(t,!1)&&(n.c.trigger("modal_close"),$inv.cSt(e.data))}))]);n=$ocms.dlg(i,{width:1e3})},$inv.credit=function(e,t){let n,i=$$.dc("choicefrm").append([$$.dc("btn","Gutschrift").click({id:e,mode:"credit"},(e=>{n.c.trigger("modal_close"),$inv.cSt(e.data)}))]);n=$ocms.dlg(i,{width:1e3})},$inv.setPyd=function(e){confirm($ict.cpyd)&&$ocms.postXT({url:$ocms.url("inv/setpyd"),timeout:60,data:{id:e},success:e=>{alert($ict.relm)},error:()=>{alert($t.f1)}})},$inv.setUpd=function(e){confirm($ict.cupd)&&$ocms.postXT({url:$ocms.url("inv/setupd"),timeout:60,data:{id:e},success:e=>{alert($ict.relm)},error:()=>{alert($t.f1)}})},$inv.resendRem=function(e){e.stopPropagation(),e.data.id&&confirm(string($ict.remresc,[e.data.name]))&&$ocms.postXT({url:$ocms.url("rem/resend"),timeout:60,data:{id:e.data.id},success:t=>{alert(string($ict.remresr,[e.data.name]))},error:()=>{alert($t.f1)}})},$inv.dspRem=function(e){let t=$$.dc("rfrm").ldng(1),n=$ocms.dlg(t,{width:1e3});n.ft.rwText($rct.rq2),$ocms.postXT({url:$ocms.url("inv/getrem"),timeout:60,data:{id:e,drafts:!1},success:e=>{n.ft.empty();let i=$$.tblset({class:"invtbl"},t.empty()),a=$invcol.rem2,r=$$.tr(i.hd);$$.th(r);$.each(a.fields||[],((e,t)=>{$$.th(r).text(t.label)}));let l=!1;$.each(e,((e,t)=>{l=!l;let n=$$.tr(i.bdy).tC("alt",l),r=$$.td(n);n.click((function(){n.tC("selected").siblings().rC("selected")})),!0===bool(t.hasFile,!1)&&($$.dc("idl ilbtn",r,{title:$ict.dl+"\n"+t.DocumentName}).append(gi("save-file","ico")).click({id:t.Id},$inv.downloadrem),$$.dc("idl ilbtn",r,{title:$ict.remdsp+"\n"+t.DocumentName}).append(gi("eye-open","ico")).click({id:t.Id,typ:"rem"},$inv.jdisp),$$.dc("idl ilbtn",r,{title:$ict.remres+"\n"+t.DocumentName}).append(gi("refresh","ico")).click({id:t.Id,typ:"rem",name:t.DocumentName},$inv.resendRem)),$.each(a.fields||[],((e,i)=>{let a=$$.td(n).aC(i.dtype),r=t[i.name];if("function"==typeof i.dfnc)i.dfnc.call(a,r,t);else switch(i.type||""){case"date":a.text(fdt(t[i.name],"dd.MM.yy"));break;case"datetime":a.text(fdt(t[i.name]));break;case"html":a.append($$.dc("ctw").html(r)),a.append($$.dc("ttip").html(r));break;default:a.text(t[i.name])}if("InvoiceId"===(i.name||""))a.aC("keep");switch(typeof i.title){case"function":i.title.call(a,t);break;case"string":a.attr("title",cs.title)}}))}))},error:()=>{t.empty(),n.ft.rwText($t.f1)},complete:()=>{t.ldng(0)}})},$inv.ccRem=function(e,t){$(this);$ocms.postXT({url:$ocms.url("rem/lrem"),timeout:60,data:{id:e},success:n=>{let i=$invcol.rid.clone();i.applyValues(n.ov);let a=$$.dc("ac"),r=$$.tblset({class:"fullgrid fullwidth"},a);if((n.lst||[]).length>0){$$.d({style:"margin: 1.5rem 0 1rem 0;font-size: 110%;text-decoration: underline;"}).prependTo(a).text($ict.rovlh);let e=$$.tr(r.hd);$ict.rovl.forEach(((t,n)=>$$.th(e,t))),$.each(n.lst,((e,t)=>{$$.tr(r.bdy).append([$$.tdc("keep",t.subject),$$.tdc("currency",fnum(t.amount,$rct.cst)),$$.tdc("currency",fnum(t.amount_payed,$rct.cst)),$$.tdc("keep",fdt(t.DateFinalized,"dd.MM.yy"))])}))}else $$.td($$.tr(r.bdy),$ict.nd);$ocms.dlgform(i,{addcontent:a,title:string($ict.remdt,[t||"?"]),success:function(t){$inv.ccRem_s2(e,t)},typedvalues:!0})}})},$inv.rRemRw=function(e){let t=$(this),n=e.rm||{};t.empty().data({invoiceid:n.invoiceid,invoicedate:n.invoicedate,amount:n.amount,amount_payed:n.amount_payed});let i=[{lbl:$rct.cP,attr:{title:$rct.cP},data:t,fnc:$inv.eRowR}],a=$$.dc("axf").append($inv.rowCtxMenu(i));t.append([$$.tdc("aux").append(a),$$.tdc("keep",n.invoiceid),$$.tdc("keep",fdt(n.invoicedate,"dd.MM.yy")),$$.tdc("currency",fnum(n.amount,$rct.cst)),$$.tdc("currency",fnum(n.amount_payed,$rct.cst)),$$.tdc("currency",fnum(n.amount-n.amount_payed,$rct.cst))])},$inv.eRowR=function(e){let t=$(this),n=e.data,i=n.data()||{},a=$invcol.rem.clone().applyValues(i);$ocms.dlgform(a,{title:t.data("dialog")||"",success:function(e){let i=t.closest("table"),a=i.data();$.extend(a.rm,e),i.data(a),$inv.rRemRw.call(n,a),$inv.rd.syncAmount(a.rm.amount,a.rm.amount_payed)},typedvalues:!0})},$inv.ccRem_s2=function(e,t){$fis.lf(!1).rC("fix").aC("hd");let n=$$.dc("invoice_layout",$fis.frm_edit()).append($$.dc("btn sprev").click($inv.rprev));$inv.eM(!1,!0);$$.dc("rfrm").ldng(1);$ocms.postXT({url:$ocms.url("rem/get"),timeout:60,data:$.extend({id:e},t),success:e=>{let t=e.rm||{},i=$$.dc("srq",n),a=$$.tblset({class:"invi"},i);a.ft=$$[0]("tfoot"),a.tbl.data($.extend({invid:t.invid,new:{}},e));let r=$$.tr(a.hd).aC("shd").append([$$.th().aC("aux")]);$ict.remHR.forEach((e=>$$.th(r,e))),$inv.rRemRw.call($$.tr(a.bdy),a.tbl.data()),a.ft.appendTo(a.tbl);let l={invoiceemail:"Email-Adresse ändern",subject:"Betreff ändern"},s=(e,t,i,r,s)=>{let d=$$.dc("inpfrm",n).aC(e).append("string"==typeof r?$$.dc("ahd",r):r>0?$$.dc("ahd",$rct.frm[i]):null),c=$$.dc("content",d).rwText(t);$$.dc("axf",d).append($$.dc("ibtn edit",{title:l[i]||$rct.frmTT[i]||$rct.frm[i]}).data("dialog",$rct.frm[i]).append(gi("pencil")).click($.extend({t:c,nme:i,change:e=>{a.tbl.data("new")[i]=e}},s),$inv.eHtml)),a.tbl.data("new")[i]=t};s("tfrm",t.subject,"subject",0,null),s("adrfrm",t.invoiceaddress,"invoiceaddress",0,null),s("emailfrm",t.invoiceemail,"invoiceemail",0,null),$$.dc("sndfrm",n).append($$.dc("content").text(t.sender)),a.tbl.children("tbody").each($inv.bdysort),a.tbl.trigger("fds.inv");let d=a.tbl.data("new");d.amount=t.amount,d.amount_payed=t.amount_payed,$inv.rd.seed({rem:{invid:t.invid,type:t.type,invoiceid:t.invoiceid,invoicedate:t.invoicedate},new:d})},complete:()=>{}})},$inv.rprev=()=>{$inv.rd.preview()},$inv.sis=e=>{confirm($ict.sisc)&&$ocms.postXT({url:$ocms.url("inv/sis"),data:{id:e||""},success:e=>{}})},$inv.srs=e=>{confirm($ict.srsc)&&$ocms.postXT({url:$ocms.url("rem/srs"),data:{id:e||""},success:e=>{}})},$inv.mfrrel=e=>{$("#contentframe").ldng(),$ocms.postXT({url:$ocms.url("inv/mfrrel"),data:{id:e||""},success:e=>{$inv.rerenderinv()},complete:()=>{$("#contentframe").ldng(0)}})},$inv.sets={o:null,c:null,drag:null,isOpen:()=>!!$inv.sets.o,open:function(){let e=$inv.d.tbl();if(e.length<1||$inv.sets.isOpen())return;if(""===$inv.d.token()&&!e.data("dstate"))return;let t=$$.dc("setstruct");$inv.sets.c=t,$inv.sets.o=$ocms.dlg(t,{title:$ict.setst,size:[-1,960],exclusive:!1,close:()=>{$inv.sets.o=null,$inv.sets.c=null,$inv.sets.drag=null}});let n=e.data("dstate");n?$inv.sets.render(n):$inv.d.refresh()},title:e=>{let t=$$.d().html(e.t||"").text().replace(/\s+/g," ").trim();return""!==t?t:$ict.setsNoTitle||""},typLbl:e=>{let t=(e.typ||"").toString().toLowerCase();return($ict.settyp||{})[t]||e.typ||""},isSet:e=>"set"===(e.typ||"").toString().toLowerCase(),parentOf:(e,t)=>{let n=(null==e.SetItmId?"":e.SetItmId).toString(),i=(e.id||"").toString();if(""===n||n===i)return"";let a=t[n];return a&&$inv.sets.isSet(a)?n:""},isDescendant:(e,t,n)=>{let i={},a=n[e];for(;a;){let e=$inv.sets.parentOf(a,n);if(""===e||i[e])return!1;if(e===t)return!0;i[e]=!0,a=n[e]}return!1},canDrop:(e,t,n,i)=>!!e&&e.bid===n&&e.id!==t&&!$inv.sets.isDescendant(t,e.id,i),sync:e=>($inv.sets.c&&$inv.sets.c.aC("busy"),$inv.d.sync(e)),render:function(e){let t=$inv.sets.c;if(!t)return;let n=t.closest(".modal-body"),i=n.length?n.scrollTop():0;t.empty().rC("busy"),$$.dc("shint",t).text($ict.setsHint||""),(e.req||[]).forEach((e=>{if(!e)return;let n=(e.Id||"").toString();if(""===n)return;let i=(e.itm||[]).filter((e=>e&&""!==(e.id||""))),a={};i.forEach((e=>{a[(e.id||"").toString()]=e}));let r=$$.dc("sblock",t).data({bid:n});$inv.sets.rootZone($$.dc("sbhd",r).append($$.sc("nme",e.text||e.nme||n)),n,a);let l=$$.tblset({class:"stbl"},r),s=$$.tr(l.hd);($ict.setsHR||[]).forEach((e=>$$.th(s,e))),i.forEach((e=>$inv.sets.row(l.bdy,e,n,i,a))),$inv.sets.rootZone($$.dc("sroot",r).text($ict.setsRoot||""),n,a),$inv.sets.createBar(r,n,i,a)})),n.length&&n.scrollTop(i)},collapsed:{},hiddenByCollapse:function(e,t){let n={},i=e;for(;i;){let e=$inv.sets.parentOf(i,t);if(""===e||n[e])return!1;if($inv.sets.collapsed[e])return!0;n[e]=!0,i=t[e]}return!1},zone:function(e,t,n){let i=e.originalEvent||e,a=t[0].getBoundingClientRect(),r=(i.clientY||0)-a.top,l=a.height||1;return r<.3*l?"before":r>.7*l||!n?"after":"into"},clearDrop:()=>{$(".setstruct .dropok, .setstruct .dropbefore, .setstruct .dropafter").rC("dropok dropbefore dropafter")},row:function(e,t,n,i,a){let r=(t.id||"").toString(),l=parseInt(t.lvl||0,10)||0,s=$inv.sets.isSet(t),d=$inv.sets.parentOf(t,a),c=s&&!!$inv.sets.collapsed[r],o=$$.tr(e,{draggable:"true"}).aC("srow lvl"+l).tC("isset",s).tC("folded",c).data({id:r,bid:n});$inv.sets.hiddenByCollapse(t,a)&&o.aC("hid"),$$.tdc("grip",o).append(gi("move")).attr("title",$rct.mR),$$.tdc("pos",o).text(null!=t.p?t.p:"");let u=$$.tdc("typ",o);s&&u.append($$.sc("fold").attr("title",c?$ict.setsExpand:$ict.setsCollapse).append(gi(c?"triangle-right":"triangle-bottom")).click((e=>{e.stopPropagation(),c?delete $inv.sets.collapsed[r]:$inv.sets.collapsed[r]=!0;let t=$inv.d.tbl().data("dstate");t&&$inv.sets.render(t)}))),u.append($$.s($inv.sets.typLbl(t))),$$.tdc("qty",o).text(t.q||"");let m=$$.tdc("ttl",o);if(""!==d&&m.append($$.sc("seti",$inv.sets.title(a[d]))),m.append($$.sc("txt",$inv.sets.title(t)).click((function(e){e.stopPropagation(),$(this).tC("exp")}))),s){let e=i.filter((e=>$inv.sets.parentOf(e,a)===r)).length;m.append($$.sc("cnt"," ("+e+")"))}let v=i.filter((e=>$inv.sets.parentOf(e,a)===d)),p=v.findIndex((e=>(e.id||"").toString()===r)),f=v.slice(0,p).some((e=>$inv.sets.isSet(e))),h=$$.tdc("act",o),g=(e,t,n,i,a)=>$$.dc("ibtn "+e,h,{title:n}).append(gi(t)).tC("disabled",!i).click((()=>{i&&$inv.sets.sync(a)}));g("up","arrow-up",$ict.setsUp,p>0,{Target:"set.move",Ref:r,Value:-1}),g("down","arrow-down",$ict.setsDown,p>=0&&p0,{Target:"set.level",Ref:r,Value:-1}),g("in","chevron-right",$ict.setsIn,f,{Target:"set.level",Ref:r,Value:1}),o.on("dragstart",(e=>{$inv.sets.drag={id:r,bid:n},o.aC("dragging");try{e.originalEvent.dataTransfer.setData("text/plain",r),e.originalEvent.dataTransfer.effectAllowed="move"}catch(e){}})).on("dragend",(()=>{o.rC("dragging"),$inv.sets.drag=null,$inv.sets.clearDrop()}));return o.on("dragover",(e=>{if(!$inv.sets.canDrop($inv.sets.drag,r,n,a))return;e.preventDefault();let t=$inv.sets.zone(e,o,s);o.rC("dropok dropbefore dropafter").aC("into"===t?"dropok":"before"===t?"dropbefore":"dropafter")})).on("dragleave",(()=>{o.rC("dropok dropbefore dropafter")})).on("drop",(e=>{e.preventDefault(),$inv.sets.clearDrop();let t=$inv.sets.drag;if($inv.sets.drag=null,!$inv.sets.canDrop(t,r,n,a))return;let i=$inv.sets.zone(e,o,s);"into"===i?$inv.sets.sync({Target:"set.assign",Ref:t.id,Value:{parent:r}}):$inv.sets.sync({Target:"set.move",Ref:t.id,Value:{anchor:r,where:i}})})),o},rootZone:function(e,t,n){return e.on("dragover",(i=>{(()=>{let e=$inv.sets.drag;return!!e&&e.bid===t&&!!n[e.id]&&""!==$inv.sets.parentOf(n[e.id],n)})()&&(i.preventDefault(),e.aC("dropok"))})).on("dragleave",(()=>{e.rC("dropok")})).on("drop",(i=>{i.preventDefault(),e.rC("dropok");let a=$inv.sets.drag;$inv.sets.drag=null,a&&a.bid===t&&n[a.id]&&""!==$inv.sets.parentOf(n[a.id],n)&&$inv.sets.sync({Target:"set.assign",Ref:a.id,Value:{parent:""}})})),e},createBar:function(e,t,n,i){let a=$$.dc("screate",e),r=$("").attr({name:"typ"}).append([$$.opt("set",$ict.settyp.set),$$.opt("text",$ict.settyp.text)]),l=$("").attr({name:"parent"}).append($$.opt("",$ict.setsTop));n.forEach((e=>{if(!$inv.sets.isSet(e))return;let t=parseInt(e.lvl||0,10)||0;l.append($$.opt((e.id||"").toString()," ".repeat(3*t)+$inv.sets.title(e)))}));let s=$('').attr({name:"title",placeholder:$ict.setsTitle,maxlength:250}),d=()=>{let e=(s.val()||"").toString().trim();""!==e?($inv.sets.sync({Target:"set.create",Ref:t,Value:{typ:r.val(),title:e,parent:l.val()||""}}),s.val("")):s.focus()};return s.on("keydown",(e=>{"Enter"===e.key&&(e.preventDefault(),d())})),a.append([$$.sc("lbl",$ict.setsNew),r,$$.sc("lbl",$ict.setsInto),l,s,$$.bbtn($ict.setsAdd,"sadd").click(d)]),a}}; \ No newline at end of file diff --git a/Fuchs/wwwroot/web/fis.min.css b/Fuchs/wwwroot/web/fis.min.css index e608f93..f0b1584 100644 --- a/Fuchs/wwwroot/web/fis.min.css +++ b/Fuchs/wwwroot/web/fis.min.css @@ -1 +1 @@ -@charset "UTF-8";@font-face{font-family:"Glyphicons Halflings";src:url(/fts/glyphicons-halflings-regular.eot);src:url(/fts/glyphicons-halflings-regular.eot?#iefix) format("embedded-opentype"),url(/fts/glyphicons-halflings-regular.woff2) format("woff2"),url(/fts/glyphicons-halflings-regular.woff) format("woff"),url(/fts/glyphicons-halflings-regular.ttf) format("truetype"),url(/fts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format("svg")}.glyphicon{position:relative;top:1px;display:inline-block;font-family:"Glyphicons Halflings";font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"*"}.glyphicon-plus:before{content:"+"}.glyphicon-eur:before,.glyphicon-euro:before{content:"€"}.glyphicon-minus:before{content:"−"}.glyphicon-cloud:before{content:"☁"}.glyphicon-envelope:before{content:"✉"}.glyphicon-pencil:before{content:"✏"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"⛺"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"⌛"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before,.glyphicon-btc:before,.glyphicon-xbt:before{content:"\e227"}.glyphicon-jpy:before,.glyphicon-yen:before{content:"¥"}.glyphicon-rub:before,.glyphicon-ruble:before{content:"₽"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*,:after,:before{box-sizing:border-box;transition:visibility 1s linear,opacity 1s linear;-moz-transition:visibility 1s linear,opacity 1s linear;-webkit-transition:visibility 1s linear,opacity 1s linear}body,html{-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility;image-rendering:auto;shape-rendering:geometricprecision;color-rendering:optimizeQuality;font-size:14px;background-color:#1b4379}@media (max-width:796px) and (min-width:362px){body,html{font-size:15px}}@media (max-width:361px){body,html{font-size:12px}}html{font-family:Arial,Arial,Helvetica Neue,Helvetica,sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{font-family:Arial,Arial,Helvetica Neue,Helvetica,sans-serif;font-weight:400;overflow:hidden;position:relative;height:100vh;width:100vw;margin:0}body.busy,body.busy *{cursor:wait!important}body>*{position:fixed;left:.5rem;right:.5rem}body header{top:.5rem;height:2.3rem;z-index:10;max-height:2.3rem;background-color:#1b4379}body main{background-color:#fff;top:2.8rem;bottom:2.8rem;z-index:9;overflow:auto;position:absolute}body footer{bottom:0;height:2.3rem;max-height:2.3rem;z-index:8;overflow:hidden}.h1,.h2,.h3,.h4,h1,h2,h3,h4{color:#1b4379}.h1,h1{font-size:1.45rem;letter-spacing:.0725rem;font-weight:700;margin:1.45rem 0 .8rem}.h2,h2{font-size:1.35rem;letter-spacing:.0675rem;font-weight:600;margin:1.35rem 0 .7rem}.h3,h3{font-size:1.2rem;letter-spacing:.04rem;font-weight:500;margin:1rem 0 .5rem}.h4,h4{letter-spacing:.015rem;font-weight:400;margin:.6rem 0 .3rem}p{margin:0 0 .6rem}.loading{background-image:url(data:image/gif;base64,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);background-position:center center;background-repeat:repeat-x}#mainframe{top:5px;left:5px;right:5px;bottom:5px}div.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0;display:flex;align-items:center;justify-items:center;justify-content:center;align-content:center;background-color:rgba(50,50,50,.3)}div.modal>.modal-dialog{background-clip:padding-box;display:none;max-width:calc(100vw - 1rem);max-height:calc(100vh - 1rem);-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0);position:relative}div.modal>.modal-dialog.szfull{width:calc(100vw - 5rem);height:calc(100vh - 5rem)}div.modal>.modal-dialog.in{display:block}div.modal>.modal-dialog.fade .out{opacity:0}div.modal>.modal-dialog.fade .in{opacity:1}div.modal>.modal-dialog>.modal-close{position:absolute;top:-.5rem;right:-.5rem;content:"X";height:1.4rem;width:1.4rem;color:#000;z-index:1;border-radius:50%;padding:.5rem;border:1px solid #000;display:block;background:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjwhRE9DVFlQRSBzdmcgIFBVQkxJQyAnLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4nICAnaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkJz48c3ZnIGhlaWdodD0iNTEycHgiIGlkPSJMYXllcl8xIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA1MTIgNTEyOyIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgd2lkdGg9IjUxMnB4IiB4bWw6c3BhY2U9InByZXNlcnZlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj48cGF0aCBkPSJNNDM3LjUsMzg2LjZMMzA2LjksMjU2bDEzMC42LTEzMC42YzE0LjEtMTQuMSwxNC4xLTM2LjgsMC01MC45Yy0xNC4xLTE0LjEtMzYuOC0xNC4xLTUwLjksMEwyNTYsMjA1LjFMMTI1LjQsNzQuNSAgYy0xNC4xLTE0LjEtMzYuOC0xNC4xLTUwLjksMGMtMTQuMSwxNC4xLTE0LjEsMzYuOCwwLDUwLjlMMjA1LjEsMjU2TDc0LjUsMzg2LjZjLTE0LjEsMTQuMS0xNC4xLDM2LjgsMCw1MC45ICBjMTQuMSwxNC4xLDM2LjgsMTQuMSw1MC45LDBMMjU2LDMwNi45bDEzMC42LDEzMC42YzE0LjEsMTQuMSwzNi44LDE0LjEsNTAuOSwwQzQ1MS41LDQyMy40LDQ1MS41LDQwMC42LDQzNy41LDM4Ni42eiIvPjwvc3ZnPg==) center center/75% no-repeat border-box #fff;cursor:pointer}@media (max-width:550px){div.modal>.modal-dialog>.modal-close{height:2rem;width:2rem}}div.modal>.modal-dialog .invalid .modal-footer div.note_invalid{display:inline-block}div.modal>.modal-dialog .modal-footer div.note_invalid{display:none}div.modal>.modal-dialog>.modal-content{position:relative;background-color:#f5f5f5;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.4rem;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);overflow:auto;height:100%;max-height:calc(100vh - 1rem)}div.modal>.modal-dialog>.modal-content .modal-header.fix{position:absolute;top:0;left:0}div.modal>.modal-dialog>.modal-content .modal-body,div.modal>.modal-dialog>.modal-content .modal-footer,div.modal>.modal-dialog>.modal-content .modal-header,div.modal>.modal-dialog>.modal-content .modal-note{width:100%;display:block;position:relative;padding:1rem}div.modal>.modal-dialog>.modal-content .modal-body+div,div.modal>.modal-dialog>.modal-content .modal-footer+div,div.modal>.modal-dialog>.modal-content .modal-header+div,div.modal>.modal-dialog>.modal-content .modal-note+div{border-top:1px solid #e5e5e5}div.modal>.modal-dialog>.modal-content .modal-body>.choicefrm{padding:1rem}div.modal>.modal-dialog>.modal-content .modal-body>.choicefrm>div{display:block;margin:1rem}div.modal>.modal-dialog>.modal-content .modal-body>.choicefrm>div:hover{background-color:#eee}div.modal>.modal-dialog>.modal-content .modal-body>.choicefrm>div.btn.inactive{cursor:not-allowed;text-decoration:line-through}div.modal>.modal-dialog>.modal-content .modal-body table .ilbtn{display:inline-block}div.modal>.modal-dialog>.modal-content .modal-body table.fullgrid{border-collapse:collapse}div.modal>.modal-dialog>.modal-content .modal-body table.fullgrid td,div.modal>.modal-dialog>.modal-content .modal-body table.fullgrid th{padding:.1rem .5rem;border:1px solid #ccc}div.modal>.modal-dialog>.modal-content .modal-body table.fullgrid th{font-weight:bolder;border-bottom-width:2px}div.modal>.modal-dialog>.modal-content .modal-body table.fullwidth{width:100%}div.modal>.modal-dialog>.modal-content .modal-footer{text-align:right}div.modal>.modal-dialog>.modal-content .modal-footer div.note_required{float:left;font-size:.7rem}div.modal>.modal-dialog>.modal-content .modal-footer div.note_invalid{color:red;font-size:1rem;float:left;clear:both;margin-top:.5rem}div.modal>.modal-dialog>.modal-content .modal-note#dataprivacy{font-size:.8rem}div.modal>.modal-dialog>.modal-content .frm.c13{display:inline-flex;vertical-align:top}div.modal>.modal-dialog>.modal-content .frm.c13:first-child{width:30%}div.modal>.modal-dialog>.modal-content .frm.c13:nth-child(n+2){width:70%;padding-left:1.5rem}#oci_login #dbtn-forgotpw{margin-top:1rem;float:left;clear:both}#oci_login .modal-footer{min-height:5.8rem}.btn,button{border-radius:.28rem;display:inline-block;padding:.45rem 1rem .5rem;margin-bottom:0;font-size:1rem;letter-spacing:.025rem;font-weight:500;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid #ababab;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-box-shadow:1px 1px 3px rgba(50,50,50,.3);box-shadow:1px 1px 3px rgba(50,50,50,.3)}.btn.btn-primary,button.btn-primary{background-color:#1b4379;color:#fff}.btn.btn-sm,button.btn-sm{border-radius:.28rem;padding:.25rem .7rem .3rem;font-size:.8rem;letter-spacing:.015rem}.form,form{height:inherit;width:inherit}.form span.ind_required,form span.ind_required{color:red;font-weight:400;padding-left:5px;padding-right:5px}.form button,.form html input[type=button],.form input[type=reset],.form input[type=submit],form button,form html input[type=button],form input[type=reset],form input[type=submit]{-webkit-appearance:button;cursor:pointer}.form button,.form select,form button,form select{text-transform:none}.form textarea,form textarea{overflow:auto;resize:vertical}.form label,form label{padding-right:1.5rem;display:inline-block;box-sizing:content-box}.form .form-body,form .form-body{display:table;width:100%}@media (max-width:796px){.form .form-body.stacked .form-group,form .form-body.stacked .form-group{margin-bottom:.25rem;display:block}.form .form-body.stacked .form-group .form-itm,form .form-body.stacked .form-group .form-itm{display:block;width:100%;max-width:100%;padding-bottom:.1rem}.form .form-body.stacked .form-group .form-itm:first-child,form .form-body.stacked .form-group .form-itm:first-child{width:100%}}.form .form-body .form-group,form .form-body .form-group{margin-bottom:1rem;display:table-row}.form .form-body .form-group.cgrp,form .form-body .form-group.cgrp{margin-top:1.5rem}.form .form-body .form-group .form-itm,form .form-body .form-group .form-itm{display:table-cell;vertical-align:top;padding-bottom:1rem}.form .form-body .form-group .form-itm:first-child,form .form-body .form-group .form-itm:first-child{width:10%}.form .form-body .form-group .form-itm>table,form .form-body .form-group .form-itm>table{width:100%}.form .form-body .form-group .form-sep,form .form-body .form-group .form-sep{display:table-cell;padding-top:1rem;border-top:1px solid #e5e5e5;height:2px}.form .form-body .form-group .form-control,form .form-body .form-group .form-control{display:block}.form .form-body .form-group input.form-control,.form .form-body .form-group select.form-control,form .form-body .form-group input.form-control,form .form-body .form-group select.form-control{width:100%}.form .form-body .form-group .input-group,form .form-body .form-group .input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.form .form-body .form-group .input-group .input-group-btn,.form .form-body .form-group .input-group .input-group-text,form .form-body .form-group .input-group .input-group-btn,form .form-body .form-group .input-group .input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.3rem}.form .form-body .form-group .input-group .input-group-btn.narrow,.form .form-body .form-group .input-group .input-group-text.narrow,form .form-body .form-group .input-group .input-group-btn.narrow,form .form-body .form-group .input-group .input-group-text.narrow{padding-left:.375rem;padding-right:.375rem}.form .form-body .form-group .input-group .input-group-btn,form .form-body .form-group .input-group .input-group-btn{cursor:pointer}.form .form-body .form-group .input-group .input-group-btn:hover,form .form-body .form-group .input-group .input-group-btn:hover{background-color:#f1f3f5}.form .form-body .form-group .input-group>:not(:last-child),form .form-body .form-group .input-group>:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.form .form-body .form-group .input-group>:not(:first-child),form .form-body .form-group .input-group>:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0;margin-left:-1px}.form .form-body .form-group .input-group>.form-control,.form .form-body .form-group .input-group>.form-select,.form .form-body .form-group .input-group>.form-set,form .form-body .form-group .input-group>.form-control,form .form-body .form-group .input-group>.form-select,form .form-body .form-group .input-group>.form-set{position:relative;flex:1 1 auto;width:1%;min-width:0}.form .form-body .form-group .input-group>.form-set .dropdown-menu,form .form-body .form-group .input-group>.form-set .dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.form .form-body .form-group .input-group>.form-set .dropdown-menu .divider,form .form-body .form-group .input-group>.form-set .dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.form .form-body .form-group .input-group>.form-set .dropdown-menu>li>a,form .form-body .form-group .input-group>.form-set .dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.form .form-body .form-group .input-group>.form-set .dropdown-menu>li>a:focus,.form .form-body .form-group .input-group>.form-set .dropdown-menu>li>a:hover,form .form-body .form-group .input-group>.form-set .dropdown-menu>li>a:focus,form .form-body .form-group .input-group>.form-set .dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.form .form-body .form-group .input-group>.form-set .dropdown-menu>.active>a,.form .form-body .form-group .input-group>.form-set .dropdown-menu>.active>a:focus,.form .form-body .form-group .input-group>.form-set .dropdown-menu>.active>a:hover,form .form-body .form-group .input-group>.form-set .dropdown-menu>.active>a,form .form-body .form-group .input-group>.form-set .dropdown-menu>.active>a:focus,form .form-body .form-group .input-group>.form-set .dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.form .form-body .form-group .input-group>.form-set .dropdown-menu>.disabled>a,.form .form-body .form-group .input-group>.form-set .dropdown-menu>.disabled>a:focus,.form .form-body .form-group .input-group>.form-set .dropdown-menu>.disabled>a:hover,form .form-body .form-group .input-group>.form-set .dropdown-menu>.disabled>a,form .form-body .form-group .input-group>.form-set .dropdown-menu>.disabled>a:focus,form .form-body .form-group .input-group>.form-set .dropdown-menu>.disabled>a:hover{color:#777}.form .form-body .form-group .input-group>.form-set .dropdown-menu>.disabled>a:focus,.form .form-body .form-group .input-group>.form-set .dropdown-menu>.disabled>a:hover,form .form-body .form-group .input-group>.form-set .dropdown-menu>.disabled>a:focus,form .form-body .form-group .input-group>.form-set .dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none}.form .form-body .form-group .input-group>.form-set>.form-control,form .form-body .form-group .input-group>.form-set>.form-control{border-radius:0}.form .form-body .form-group.hd,.form .form-body .form-group>.hd,form .form-body .form-group.hd,form .form-body .form-group>.hd{display:none}.form textarea.form-control,form textarea.form-control{height:5rem}.form textarea.form-control[rows],form textarea.form-control[rows]{height:auto}.form .form-control,form .form-control{appearance:none;display:block;width:100%;height:2.5rem;padding:.5rem .8rem;font-size:1rem;line-height:1.42857143;color:#525252;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:.3rem;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;-o-transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;box-sizing:border-box}.form .form-control:focus,form .form-control:focus{border-color:#1b4379;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(27,67,121,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(27,67,121,.6)}.form .form-control:invalid,form .form-control:invalid{border-color:#da6600}.form .form-control:-ms-input-placeholder,.form .form-control::-moz-placeholder,.form .form-control::-webkit-input-placeholder,form .form-control:-ms-input-placeholder,form .form-control::-moz-placeholder,form .form-control::-webkit-input-placeholder{color:#262626;opacity:1}.form .form-control::-ms-expand,form .form-control::-ms-expand{background-color:transparent;border:0}.form .form-control[size],form .form-control[size]{height:auto}.form .form-control[disabled],.form .form-control[readonly],fieldset[disabled] .form .form-control,fieldset[disabled] form .form-control,form .form-control[disabled],form .form-control[readonly]{background-color:#eee;opacity:1}.form .form-control[disabled],fieldset[disabled] .form .form-control,fieldset[disabled] form .form-control,form .form-control[disabled]{cursor:not-allowed}body.div.pgb{-webkit-pointer-events:none;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.div.pgb .pgb-progress{background:#1ab394;position:fixed;z-index:2040;top:0;right:100%;width:100%;height:2px}body.div.pgb .pgb-progress.inactive{display:none}#topbar{display:block;position:absolute;background-color:#1b4379;left:0;right:0;min-height:2.3rem;height:auto;z-index:4}#topbar.hd{height:0!important;min-height:0;overflow:hidden}#topbar.hd~#contentframe,#topbar.hd~#listframe{top:0}#topbar~#contentframe,#topbar~#listframe{top:2.3rem}#topbar>nav{padding-top:0}#contentframe{position:absolute;overflow:auto;top:0;left:0;right:0;bottom:0;z-index:2}#listframe{position:absolute;overflow:auto;top:2.3rem;left:0;right:auto;bottom:0;min-width:20%;max-width:100%;z-index:3;background-color:#fff;border-right:1px solid #1b4379;transition:width 1s,min-width 1s}#listframe.hd:not(.fix){min-width:0;width:0;overflow:hidden}#sidebar~div{left:2.3rem}body>.timer{position:fixed;bottom:3px;height:1px;border-bottom:2px solid #ff0;transition:width 1s linear;left:0}#oci_login{width:600px}#mainmenu{border-bottom:1px solid #ccc}nav{position:relative;left:0;width:100%;display:block;z-index:10000;border-radius:0;min-height:2.3rem;height:2.3rem;max-height:2.3rem;padding-left:0;margin-bottom:0;list-style:none;color:#e3e7e7;background-color:#1b4379}nav.nv{height:100%;max-height:100%;width:2.3rem;max-width:2.3rem}nav.nv ul{min-height:0;min-width:100%}nav.nv ul>li{height:auto;width:100%;padding-top:0;padding-bottom:0}nav.nv ul>li a{width:100%;height:auto;padding:1rem 0}nav.nv ul>li a span.ico{width:100%;height:2.3rem}nav.nv>ul{height:auto}nav #logo{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAADVElEQVRYhe2V309bZRjH+TvovDJbuZkXJsY7Yckpg9pF3QXtKAksxoWZxYEQPWsLtbSW/XDRqcnsYub0YrvxYiNZWTYXIzMQY0xMrHSOtlBKa1vWM3Br2UjP+/HinB1haDxktNzsTb55z8n75D2ffPN8n9PQKMlspxqeAWzVRRZJpsUV4MDhU3T0nmS3w1dfgJ1tHi5cGiefLzGbznFo8DMs9QSw2j2Mjd9CFYJyZYW+oUh9AXa1awBCB+j3bSdAeRscsNq9XIlO6AAP6a83QJPdy+WrE4YD/UMRLLYaAFjbPexxjeDoCeM4qKsnzOtvHufazSmEEFQqK3xw4hscPaPs6xnVavX91e4PeWGfb/MAz9mO4T5ymus3f2IhW6BQVP7RYonCosKDBxUAVFWgKMsUFh+fayreVVjIFTkWOm+4YwrAIskc7PuEzEIBIQRmlhAghFgv4NHqKuEzF9mxGYCX3hhm6ueYdokqyBdKTN9OGYrFk0zHUxSKCgDVapWZZIbYdIJYPMnv8RSx6SSxeJJff7vDUd8XRoOaAuh+52OWlu4DMDef49Dgp+xxjdDcEdDkDNDqDhG9Pmn0gDd8nhZXgFec2nmLM6C9dwTY2eYx3wMWSaZ/KEK5soIQguiNSaztng11Tw6iLZsDFklmYDhCpfIQIQRj47fY9S8ATXYP176bMmJ41Hd2cwBN7V6kziB73SFa3SFsnUGkziCtXSH8J742AKI3pnB0h2l1B7Hp2tsVos93lmyuCIBy7y+6jpw2la6GRknGYpMZ8J8j/scsM4l5ZhJpfZ/nTiJNOvMn1aoKQElZIpHUahKpeV0ZSsqS0e0//PgLL742ZB5gh00mfOYij1ZXn4iQ9mx2qapKMpWh8+2PTNm/zoH3g18yO5cjmyuykF2jXJFCUUFVNQeWl+9vrMkWSKQyfDv2PfvfOm5k3DTA4yZqXhsZ54gm1wi+0a/W9MAkkjuo12k1zc4AL+/383zbxuZ8+hTYZN71RyiXtRhevjpBk9276Q89VQwH/eco6w5ciU5grTfAwBqA/5oDNQb4/0FUW4DhCJXKCqoOYLXXGaD3vc+ZS+fI50tcuDS+7mdSc4BGSWa3w0dH70kOHD5FiytgeshsGUAt9Qzgb8pqydEEvRadAAAAAElFTkSuQmCC) center center/contain no-repeat;margin-right:10px;height:1.9rem;width:1.9rem}nav .nav-header{float:left;position:relative;padding-left:0;margin:0;list-style:none;min-height:100%}nav .nav-header>div{float:left;padding:.4rem 1rem 0 0;line-height:1.4rem;height:100%}nav .nav-header>button,nav .nav-header>div.button{float:left;height:100%;padding:.2rem .8rem;background:0 0;color:inherit;margin-right:1.1rem;box-shadow:none}nav .nav-header .activemodule,nav .nav-header .brand{cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}nav .nav-header .activemodule{color:#fff240;overflow:hidden}@media (min-width:551px){nav .nav-header .activemodule{max-width:calc(100% - 46px);font-size:16px}nav .nav-header .brand{display:inline-block}}@media (max-width:550px){nav .nav-header .brand{display:none}nav .nav-header .activemodule{max-width:calc(100% - 190px);font-size:16px;line-height:28px;padding:0}}@media (min-width:797px){nav .nav-header #mmmb{display:none!important;pointer-events:none}nav ul.nav-right{float:right!important}nav ul.nav-right li.dropdown.submenu>ul{left:auto;right:100%;right:calc(100% + .1rem)}nav ul li[role=separator]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none}nav ul li[role=separator]::before{content:"|";cursor:default;padding:.4rem 1rem 0;line-height:1.4rem;height:100%;display:block;font-weight:400;white-space:nowrap;min-height:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none}}@media (max-width:796px){nav.nv{padding-top:2.3rem}nav.nv>ul{display:none}nav .nav-header{width:100%;position:absolute;top:0;left:0}nav .nav-header #mmmb{float:right;margin-right:0}nav{padding-top:2.3rem}nav.ctxt>ul{width:100%}nav.ctxt>ul>li[role=lbl]{max-width:55vw;white-space:nowrap;overflow:hidden;font-size:85%}nav.ctxt>ul>li>a,nav.ctxt>ul>li>a.fbtn{padding:.4rem .75rem 0}nav.ctxt>ul>li>a>span{display:none}nav.ctxt>ul>li>a>span.caret,nav.ctxt>ul>li>a>span.glyphicon,nav.ctxt>ul>li>a>span.ico{display:inline-block}nav#mainmenu.vis>ul{display:block}nav#mainmenu>ul{padding-bottom:1rem;display:none;width:100%;float:none}nav.vis>ul{height:auto}nav.vis>ul li{width:100%;float:none}nav.vis>ul li[role=separator]{padding:0 1rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none;margin:.3rem 0}nav.vis>ul li[role=separator]::before{content:"";cursor:default;position:relative;width:100%;height:100%;border-bottom:1px solid #e3e7e7;display:block}}nav>ul{height:100%;float:left}nav ul{position:relative;padding-left:0;margin:0;list-style:none;min-height:100%;background-color:inherit}nav ul>li{list-style:none;float:left;position:relative;display:block;padding-left:0;margin-bottom:0;height:100%}nav ul>li.ar{float:right}nav ul>li[role=info],nav ul>li[role=lbl]{color:#fff240;padding:.5rem .5rem 0}nav ul>li a{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;padding:.4rem 1rem 0;line-height:1.4rem;height:100%;display:block;font-weight:400;white-space:nowrap;min-height:inherit}nav ul>li a span+.caret,nav ul>li a span+span{margin-left:.5rem}nav ul>li a span.ico{height:1.1rem;width:1.1rem;background-color:transparent;background-repeat:no-repeat;background-position:center center;background-size:contain;background-clip:content-box;display:inline-block;padding:.15rem}nav ul>li a>.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-right:4px solid transparent;border-left:4px solid transparent}nav ul>li a>.glyphicon{font-size:1.1rem}nav ul>li a[role=button]::after{content:"";position:absolute;top:.2rem;left:.1rem;right:.1rem;bottom:0;border-top:1px solid transparent;border-left:1px solid transparent;border-right:1px solid transparent;border-bottom:none;border-top-left-radius:.2rem;border-top-right-radius:.2rem}nav ul>li a[role=button].fbtn::after,nav ul>li a[role=button]:hover::after{border-color:rgba(227,231,231,.6);border-top-left-radius:.2rem;border-top-right-radius:.2rem}nav ul>li a.disabled{cursor:default;opacity:.5}nav ul>li.dropdown{position:relative}nav ul>li.dropdown.submenu>ul{position:absolute;top:0;left:100%;left:calc(100% + .1rem);right:auto;min-height:inherit}nav ul>li.dropdown>ul{display:none}nav ul>li.dropdown>ul>li{min-height:2.3rem;float:none;display:block}nav ul>li.dropdown.open>ul{display:block}nav ul>li.dropdown.open>a{background-color:rgba(227,231,231,.6);color:#fff}@media (max-width:796px){nav ul>li.dropdown.open>ul{position:fixed;top:5.1rem;top:calc(5.1rem - 2px);left:.5rem;right:.5rem;left:calc(.5rem - 1px);right:calc(.5rem - 1px);height:auto;min-height:25%}}nav ul.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:5px 0;margin:2px 0 0;font-size:1rem;text-align:left;background-color:#1b4379;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}nav ul.dropdown-menu.right{right:0;left:auto}nav ul.dropdown-menu li.divider,nav ul.dropdown-menu li[role=separator]{height:1px;margin:.25rem 0 .7rem;overflow:hidden;background-color:#e5e5e5;min-height:1px;max-height:1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}nav ul.dropdown-menu li.info,nav ul.dropdown-menu li[role=info],nav ul.dropdown-menu li[role=lbl]{color:#ffff4a;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}nav ul.dropdown-menu li>span{padding:.4rem 1rem 0 .4rem;display:inline-block}nav ul.dropdown-menu li a[role=button]::after{border-left:none;border-right:none;border-top-left-radius:0}span.sbc{background-image:url(/ct/img/wave_v.svg)}table.sortable>tr.sortactive>td,tbody.sortable>tr.sortactive>td{background-color:#ffffe0!important;box-shadow:1px 1px 2px rgba(50,50,50,.3)}#contentframe>.edit_frm+.list_frm{display:none}.list_frm{min-height:100%}main nav ul>li a[role=button]::after{border-top:1px solid rgba(227,231,231,.6);border-left:1px solid rgba(227,231,231,.6);border-right:1px solid rgba(227,231,231,.6)}main nav ul>li a[role=button].fbtn::after,main nav ul>li a[role=button]:hover::after{border-color:#e3e7e7}#dashboard_frame{overflow-y:auto;height:100%;width:100%;padding:1rem;background:#ddd;text-align:center}#notification_frame{height:100%;overflow:hidden;display:flex;flex-direction:column;pointer-events:none}.notification_item{position:relative;flex:0 0 2.3rem;height:2.3rem;box-sizing:border-box;display:flex;align-items:center;text-align:left;white-space:nowrap;overflow:hidden;color:#fff;padding:0 2.2rem 0 .85rem;pointer-events:auto}.notification_item.error,.notification_item.warn,.notification_item.warning{color:#ffc801}.notification_item .notification_title{font-weight:700;flex:0 0 auto}.notification_item .notification_title::after{content:":";margin-right:.35rem}.notification_item .notification_message{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.notification_item .notification_close{position:absolute;top:0;right:.45rem;height:100%;border:0;background:0 0;color:inherit;cursor:pointer;font-size:1.2rem;line-height:2.3rem;padding:0 .25rem}.wdg_loading_ind{color:#999;font-size:.8rem;margin-bottom:10px;padding-left:1.3rem;position:relative}.wdg_loading_ind::before{animation:.8s linear infinite wdg_loading_spin;border:2px solid #ddd;border-top-color:#1b4379;border-radius:50%;content:"";height:.85rem;left:0;position:absolute;top:.05rem;width:.85rem}@keyframes wdg_loading_spin{to{transform:rotate(360deg)}}.wdg_frame{background-color:#fff;border:1px solid #ccc;border-radius:6px;box-shadow:1px 2px 8px 0 rgba(140,140,160,.6),-2px -3px 8px 0 #fafafa;display:inline-block;height:300px;margin-bottom:10px;position:relative;width:300px;margin-right:15px;text-align:left;overflow:hidden}.wdg_frame.dbl{width:615px}.wdg_frame.tpl{width:930px}.wdg_frame.tny{width:150px}.wdg_frame.tny .wdg_cnt>.ind label{font-size:80%}.wdg_frame .wdg_hd{border-top-left-radius:inherit;border-top-right-radius:inherit;height:1.5rem;position:relative;background-color:rgba(27,67,121,.85);box-shadow:1px 5px 5px #1b4379 inset;color:#fff;text-align:center;font-size:.8rem;font-weight:700;padding:.3rem .2rem 0;cursor:pointer;margin:-1px -1px 0}.wdg_frame .wdg_hd>*{user-select:none}.wdg_frame .wdg_cnt{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;height:calc(100% - 24px);overflow-x:hidden;overflow-y:auto;padding:0;position:relative}.wdg_frame .wdg_cnt>.ind{text-align:center;padding:1rem;font-size:1.3rem}.wdg_frame .wdg_cnt>.ind.sts_neg>.ind{color:red}.wdg_frame .wdg_cnt>.ind.sts_pos>.ind{color:#56a532}.wdg_frame .wdg_cnt>.ind>.ind{font-size:4rem;margin:3rem 0;text-shadow:.08rem .12rem .35rem rgba(50,50,50,.6);color:#1b4379}.wdg_frame .wdg_cnt .clickable{cursor:pointer}.wdg_frame .wdg_cnt table{border-collapse:collapse;width:100%}.wdg_frame .wdg_cnt table tr:first-child{border:none}.wdg_frame .wdg_cnt table th{background-color:#ccc;padding:2px 4px;font-size:11px;line-height:1.2;border:1px solid transparent;text-align:left}.wdg_frame .wdg_cnt table th:first-child{border-left:none}.wdg_frame .wdg_cnt table th:last-child{border-right:none}.wdg_frame .wdg_cnt table td{padding:2px 4px;font-size:12px;line-height:1.1;border:1px solid #ccc}.wdg_frame .wdg_cnt table td:first-child{border-left:none}.wdg_frame .wdg_cnt table td:last-child{border-right:none}#listframe div.mth,#listframe div.yr{border:1px solid #ccc;background-color:#eee;padding:.4rem .2rem .2rem .35rem;border-radius:.2rem;cursor:pointer;margin:.2rem;position:relative;display:block;white-space:nowrap;min-height:2rem}#listframe div.mth.extra,#listframe div.yr.extra{text-decoration:red underline}#listframe div.mth.ivc+.extra,#listframe div.yr.ivc+.extra{margin-top:.4rem}#listframe div.mth.selected,#listframe div.yr.selected{background-color:#90ee90}#listframe div.mth.selected>div.mfrm,#listframe div.mth.selected>div.wfrm,#listframe div.yr.selected>div.mfrm,#listframe div.yr.selected>div.wfrm{display:block}#listframe div.mth.selected>div.mthdl,#listframe div.mth.selected>div.wthdl,#listframe div.mth.selected>div.ythdl,#listframe div.yr.selected>div.mthdl,#listframe div.yr.selected>div.wthdl,#listframe div.yr.selected>div.ythdl{display:inline-block;cursor:pointer}#listframe div.mth div.mfrm,#listframe div.mth div.wfrm,#listframe div.mth div.yfrm,#listframe div.yr div.mfrm,#listframe div.yr div.wfrm,#listframe div.yr div.yfrm{display:none;position:relative;background-color:#fff;margin:1rem .2rem .2rem 1rem;padding:.15rem;border-radius:.2rem}#listframe div.mth div.mfrm .wk,#listframe div.mth div.wfrm .wk,#listframe div.mth div.yfrm .wk,#listframe div.yr div.mfrm .wk,#listframe div.yr div.wfrm .wk,#listframe div.yr div.yfrm .wk{border:1px solid #ccc;background-color:#eee;padding:.4rem 1.35rem .2rem .35rem;border-radius:.2rem;cursor:pointer;margin:.2rem;position:relative;display:block;white-space:nowrap;min-height:2rem}#listframe div.mth div.mfrm .wk.selected,#listframe div.mth div.wfrm .wk.selected,#listframe div.mth div.yfrm .wk.selected,#listframe div.yr div.mfrm .wk.selected,#listframe div.yr div.wfrm .wk.selected,#listframe div.yr div.yfrm .wk.selected{background-color:#add8e6}#listframe div.mth div.mfrm .wk.selected div.wkdl,#listframe div.mth div.wfrm .wk.selected div.wkdl,#listframe div.mth div.yfrm .wk.selected div.wkdl,#listframe div.yr div.mfrm .wk.selected div.wkdl,#listframe div.yr div.wfrm .wk.selected div.wkdl,#listframe div.yr div.yfrm .wk.selected div.wkdl{display:inline-block;cursor:pointer}#listframe div.mthdl,#listframe div.wkdl,#listframe div.yrdl{height:1.5rem;width:1.5rem;display:none;background-color:#fff;position:absolute;right:.4rem;border:1px solid #ccc;border-radius:.2rem;padding:.1rem;top:.18rem;font-size:1rem;text-align:center}.invfrm table.invtbl,.invfrm>table{border-collapse:separate;border-spacing:0;margin:2rem}.invfrm table.invtbl th,.invfrm>table th{padding:.2rem .35rem;border:1px solid #ccc;text-align:left}.invfrm table.invtbl td.currency,.invfrm table.invtbl td.num,.invfrm table.invtbl th.currency,.invfrm table.invtbl th.num,.invfrm>table td.currency,.invfrm>table td.num,.invfrm>table th.currency,.invfrm>table th.num{text-align:right;white-space:nowrap}.invfrm table.invtbl td.keep,.invfrm table.invtbl th.keep,.invfrm>table td.keep,.invfrm>table th.keep{white-space:nowrap}.invfrm table.invtbl td,.invfrm>table td{padding:.2rem .35rem;border:1px solid #ccc;vertical-align:top;position:relative}.invfrm table.invtbl td.hl,.invfrm>table td.hl{background-color:#ffffe0}.invfrm table.invtbl td input,.invfrm table.invtbl td select,.invfrm>table td input,.invfrm>table td select{display:none}.invfrm table.invtbl td.raux,.invfrm>table td.raux{min-width:5.3rem}.invfrm table.invtbl td>.ttip,.invfrm>table td>.ttip{display:none;background:#fff;padding:.2rem .35rem;padding:inherit;border:1px solid #ccc;box-shadow:1px 1px 3px rgba(50,50,50,.5);min-width:100%;min-height:100%;border-top-color:#ff4500;z-index:5}.invfrm table.invtbl td .ctw p,.invfrm table.invtbl td .ttip p,.invfrm>table td .ctw p,.invfrm>table td .ttip p{margin:0 0 .1rem}.invfrm table.invtbl td:hover,.invfrm>table td:hover{border-top-color:#ff4500!important;border-top-width:2px}.invfrm table.invtbl td:hover>.ttip,.invfrm>table td:hover>.ttip{display:block;position:absolute;top:0;height:auto;width:auto;left:0}.invfrm table.invtbl tr:nth-child(2n+1) td,.invfrm>table tr:nth-child(2n+1) td{background-color:rgba(150,150,150,.2)}.invfrm table.invtbl tr:nth-child(2n+1) td.hl,.invfrm>table tr:nth-child(2n+1) td.hl{background-color:#ffffe0}.invfrm table.invtbl tr.selected td,.invfrm>table tr.selected td{background-color:#add8e6}.invfrm table.invtbl tr.selected td.hl,.invfrm>table tr.selected td.hl{background-color:#ffffe0}.invfrm table.invtbl tr.selected td .ilbtn,.invfrm>table tr.selected td .ilbtn{display:inline-block}.invfrm .ovhd{display:block;font-size:1.5rem;margin:1rem 2rem;font-weight:700;text-decoration:underline;text-decoration-style:double}.invfrm .ovhd>span{display:block}.invfrm .ovhd>span:first-child{text-decoration:underline;text-decoration-style:double}.invfrm .ovhd>span+span{margin-top:.5rem}.invfrm .ovhd>span.note{font-size:1rem;font-weight:400;text-decoration:none;text-decoration-style:none}.invfrm.mdw .ovhd{text-decoration-color:#add8e6}.invfrm.mdm .ovhd{text-decoration-color:#90ee90}.ilbtn{border-radius:.3rem;display:none;padding:.1rem;margin-bottom:0;font-size:1.5rem;letter-spacing:.025rem;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-color:#fff;background-image:none;border:1px solid #ababab;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-box-shadow:1px 1px 3px rgba(50,50,50,.3);box-shadow:1px 1px 3px rgba(50,50,50,.3);min-width:2.4rem} \ No newline at end of file +@charset "UTF-8";@font-face{font-family:"Glyphicons Halflings";src:url(/fts/glyphicons-halflings-regular.eot);src:url(/fts/glyphicons-halflings-regular.eot?#iefix) format("embedded-opentype"),url(/fts/glyphicons-halflings-regular.woff2) format("woff2"),url(/fts/glyphicons-halflings-regular.woff) format("woff"),url(/fts/glyphicons-halflings-regular.ttf) format("truetype"),url(/fts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format("svg")}.glyphicon{position:relative;top:1px;display:inline-block;font-family:"Glyphicons Halflings";font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"*"}.glyphicon-plus:before{content:"+"}.glyphicon-eur:before,.glyphicon-euro:before{content:"€"}.glyphicon-minus:before{content:"−"}.glyphicon-cloud:before{content:"☁"}.glyphicon-envelope:before{content:"✉"}.glyphicon-pencil:before{content:"✏"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"⛺"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"⌛"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before,.glyphicon-btc:before,.glyphicon-xbt:before{content:"\e227"}.glyphicon-jpy:before,.glyphicon-yen:before{content:"¥"}.glyphicon-rub:before,.glyphicon-ruble:before{content:"₽"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*,:after,:before{box-sizing:border-box;transition:visibility 1s linear,opacity 1s linear;-moz-transition:visibility 1s linear,opacity 1s linear;-webkit-transition:visibility 1s linear,opacity 1s linear}body,html{-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility;image-rendering:auto;shape-rendering:geometricprecision;color-rendering:optimizeQuality;font-size:14px;background-color:#1b4379}@media (max-width:796px) and (min-width:362px){body,html{font-size:15px}}@media (max-width:361px){body,html{font-size:12px}}html{font-family:Arial,Arial,Helvetica Neue,Helvetica,sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{font-family:Arial,Arial,Helvetica Neue,Helvetica,sans-serif;font-weight:400;overflow:hidden;position:relative;height:100vh;width:100vw;margin:0}body.busy,body.busy *{cursor:wait!important}body>*{position:fixed;left:.5rem;right:.5rem}body header{top:.5rem;height:2.3rem;z-index:10;max-height:2.3rem;background-color:#1b4379}body main{background-color:#fff;top:2.8rem;bottom:2.8rem;z-index:9;overflow:auto;position:absolute}body footer{bottom:0;height:2.3rem;max-height:2.3rem;z-index:8;overflow:hidden}.h1,.h2,.h3,.h4,h1,h2,h3,h4{color:#1b4379}.h1,h1{font-size:1.45rem;letter-spacing:.0725rem;font-weight:700;margin:1.45rem 0 .8rem}.h2,h2{font-size:1.35rem;letter-spacing:.0675rem;font-weight:600;margin:1.35rem 0 .7rem}.h3,h3{font-size:1.2rem;letter-spacing:.04rem;font-weight:500;margin:1rem 0 .5rem}.h4,h4{letter-spacing:.015rem;font-weight:400;margin:.6rem 0 .3rem}p{margin:0 0 .6rem}.loading{background-image:url(data:image/gif;base64,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);background-position:center center;background-repeat:repeat-x}#mainframe{top:5px;left:5px;right:5px;bottom:5px}div.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0;display:flex;align-items:center;justify-items:center;justify-content:center;align-content:center;background-color:rgba(50,50,50,.3)}div.modal>.modal-dialog{background-clip:padding-box;display:none;max-width:calc(100vw - 1rem);max-height:calc(100vh - 1rem);-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0);position:relative}div.modal>.modal-dialog.szfull{width:calc(100vw - 5rem);height:calc(100vh - 5rem)}div.modal>.modal-dialog.in{display:block}div.modal>.modal-dialog.fade .out{opacity:0}div.modal>.modal-dialog.fade .in{opacity:1}div.modal>.modal-dialog>.modal-close{position:absolute;top:-.5rem;right:-.5rem;content:"X";height:1.4rem;width:1.4rem;color:#000;z-index:1;border-radius:50%;padding:.5rem;border:1px solid #000;display:block;background:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjwhRE9DVFlQRSBzdmcgIFBVQkxJQyAnLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4nICAnaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkJz48c3ZnIGhlaWdodD0iNTEycHgiIGlkPSJMYXllcl8xIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA1MTIgNTEyOyIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgd2lkdGg9IjUxMnB4IiB4bWw6c3BhY2U9InByZXNlcnZlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj48cGF0aCBkPSJNNDM3LjUsMzg2LjZMMzA2LjksMjU2bDEzMC42LTEzMC42YzE0LjEtMTQuMSwxNC4xLTM2LjgsMC01MC45Yy0xNC4xLTE0LjEtMzYuOC0xNC4xLTUwLjksMEwyNTYsMjA1LjFMMTI1LjQsNzQuNSAgYy0xNC4xLTE0LjEtMzYuOC0xNC4xLTUwLjksMGMtMTQuMSwxNC4xLTE0LjEsMzYuOCwwLDUwLjlMMjA1LjEsMjU2TDc0LjUsMzg2LjZjLTE0LjEsMTQuMS0xNC4xLDM2LjgsMCw1MC45ICBjMTQuMSwxNC4xLDM2LjgsMTQuMSw1MC45LDBMMjU2LDMwNi45bDEzMC42LDEzMC42YzE0LjEsMTQuMSwzNi44LDE0LjEsNTAuOSwwQzQ1MS41LDQyMy40LDQ1MS41LDQwMC42LDQzNy41LDM4Ni42eiIvPjwvc3ZnPg==) center center/75% no-repeat border-box #fff;cursor:pointer}@media (max-width:550px){div.modal>.modal-dialog>.modal-close{height:2rem;width:2rem}}div.modal>.modal-dialog .invalid .modal-footer div.note_invalid{display:inline-block}div.modal>.modal-dialog .modal-footer div.note_invalid{display:none}div.modal>.modal-dialog>.modal-content{position:relative;background-color:#f5f5f5;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.4rem;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);overflow:auto;height:100%;max-height:calc(100vh - 1rem)}div.modal>.modal-dialog>.modal-content .modal-header.fix{position:absolute;top:0;left:0}div.modal>.modal-dialog>.modal-content .modal-body,div.modal>.modal-dialog>.modal-content .modal-footer,div.modal>.modal-dialog>.modal-content .modal-header,div.modal>.modal-dialog>.modal-content .modal-note{width:100%;display:block;position:relative;padding:1rem}div.modal>.modal-dialog>.modal-content .modal-body+div,div.modal>.modal-dialog>.modal-content .modal-footer+div,div.modal>.modal-dialog>.modal-content .modal-header+div,div.modal>.modal-dialog>.modal-content .modal-note+div{border-top:1px solid #e5e5e5}div.modal>.modal-dialog>.modal-content .modal-body>.imagecollection>label.backdate{display:block;margin:0 0 1rem;padding:.5rem 1rem;background-color:#fff8e1;border:1px solid #f0c36d;font-weight:700;cursor:pointer}div.modal>.modal-dialog>.modal-content .modal-body>.imagecollection>label.backdate>input{margin-right:.5rem}div.modal>.modal-dialog>.modal-content .modal-body>.choicefrm{padding:1rem}div.modal>.modal-dialog>.modal-content .modal-body>.choicefrm>div{display:block;margin:1rem}div.modal>.modal-dialog>.modal-content .modal-body>.choicefrm>div:hover{background-color:#eee}div.modal>.modal-dialog>.modal-content .modal-body>.choicefrm>div.btn.inactive{cursor:not-allowed;text-decoration:line-through}div.modal>.modal-dialog>.modal-content .modal-body table .ilbtn{display:inline-block}div.modal>.modal-dialog>.modal-content .modal-body table.fullgrid{border-collapse:collapse}div.modal>.modal-dialog>.modal-content .modal-body table.fullgrid td,div.modal>.modal-dialog>.modal-content .modal-body table.fullgrid th{padding:.1rem .5rem;border:1px solid #ccc}div.modal>.modal-dialog>.modal-content .modal-body table.fullgrid th{font-weight:bolder;border-bottom-width:2px}div.modal>.modal-dialog>.modal-content .modal-body table.fullwidth{width:100%}div.modal>.modal-dialog>.modal-content .modal-footer{text-align:right}div.modal>.modal-dialog>.modal-content .modal-footer div.note_required{float:left;font-size:.7rem}div.modal>.modal-dialog>.modal-content .modal-footer div.note_invalid{color:red;font-size:1rem;float:left;clear:both;margin-top:.5rem}div.modal>.modal-dialog>.modal-content .modal-note#dataprivacy{font-size:.8rem}div.modal>.modal-dialog>.modal-content .frm.c13{display:inline-flex;vertical-align:top}div.modal>.modal-dialog>.modal-content .frm.c13:first-child{width:30%}div.modal>.modal-dialog>.modal-content .frm.c13:nth-child(n+2){width:70%;padding-left:1.5rem}#oci_login #dbtn-forgotpw{margin-top:1rem;float:left;clear:both}#oci_login .modal-footer{min-height:5.8rem}.btn,button{border-radius:.28rem;display:inline-block;padding:.45rem 1rem .5rem;margin-bottom:0;font-size:1rem;letter-spacing:.025rem;font-weight:500;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid #ababab;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-box-shadow:1px 1px 3px rgba(50,50,50,.3);box-shadow:1px 1px 3px rgba(50,50,50,.3)}.btn.btn-primary,button.btn-primary{background-color:#1b4379;color:#fff}.btn.btn-sm,button.btn-sm{border-radius:.28rem;padding:.25rem .7rem .3rem;font-size:.8rem;letter-spacing:.015rem}.form,form{height:inherit;width:inherit}.form span.ind_required,form span.ind_required{color:red;font-weight:400;padding-left:5px;padding-right:5px}.form button,.form html input[type=button],.form input[type=reset],.form input[type=submit],form button,form html input[type=button],form input[type=reset],form input[type=submit]{-webkit-appearance:button;cursor:pointer}.form button,.form select,form button,form select{text-transform:none}.form textarea,form textarea{overflow:auto;resize:vertical}.form label,form label{padding-right:1.5rem;display:inline-block;box-sizing:content-box}.form .form-body,form .form-body{display:table;width:100%}@media (max-width:796px){.form .form-body.stacked .form-group,form .form-body.stacked .form-group{margin-bottom:.25rem;display:block}.form .form-body.stacked .form-group .form-itm,form .form-body.stacked .form-group .form-itm{display:block;width:100%;max-width:100%;padding-bottom:.1rem}.form .form-body.stacked .form-group .form-itm:first-child,form .form-body.stacked .form-group .form-itm:first-child{width:100%}}.form .form-body .form-group,form .form-body .form-group{margin-bottom:1rem;display:table-row}.form .form-body .form-group.cgrp,form .form-body .form-group.cgrp{margin-top:1.5rem}.form .form-body .form-group .form-itm,form .form-body .form-group .form-itm{display:table-cell;vertical-align:top;padding-bottom:1rem}.form .form-body .form-group .form-itm:first-child,form .form-body .form-group .form-itm:first-child{width:10%}.form .form-body .form-group .form-itm>table,form .form-body .form-group .form-itm>table{width:100%}.form .form-body .form-group .form-sep,form .form-body .form-group .form-sep{display:table-cell;padding-top:1rem;border-top:1px solid #e5e5e5;height:2px}.form .form-body .form-group .form-control,form .form-body .form-group .form-control{display:block}.form .form-body .form-group input.form-control,.form .form-body .form-group select.form-control,form .form-body .form-group input.form-control,form .form-body .form-group select.form-control{width:100%}.form .form-body .form-group .input-group,form .form-body .form-group .input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.form .form-body .form-group .input-group .input-group-btn,.form .form-body .form-group .input-group .input-group-text,form .form-body .form-group .input-group .input-group-btn,form .form-body .form-group .input-group .input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.3rem}.form .form-body .form-group .input-group .input-group-btn.narrow,.form .form-body .form-group .input-group .input-group-text.narrow,form .form-body .form-group .input-group .input-group-btn.narrow,form .form-body .form-group .input-group .input-group-text.narrow{padding-left:.375rem;padding-right:.375rem}.form .form-body .form-group .input-group .input-group-btn,form .form-body .form-group .input-group .input-group-btn{cursor:pointer}.form .form-body .form-group .input-group .input-group-btn:hover,form .form-body .form-group .input-group .input-group-btn:hover{background-color:#f1f3f5}.form .form-body .form-group .input-group>:not(:last-child),form .form-body .form-group .input-group>:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.form .form-body .form-group .input-group>:not(:first-child),form .form-body .form-group .input-group>:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0;margin-left:-1px}.form .form-body .form-group .input-group>.form-control,.form .form-body .form-group .input-group>.form-select,.form .form-body .form-group .input-group>.form-set,form .form-body .form-group .input-group>.form-control,form .form-body .form-group .input-group>.form-select,form .form-body .form-group .input-group>.form-set{position:relative;flex:1 1 auto;width:1%;min-width:0}.form .form-body .form-group .input-group>.form-set .dropdown-menu,form .form-body .form-group .input-group>.form-set .dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.form .form-body .form-group .input-group>.form-set .dropdown-menu .divider,form .form-body .form-group .input-group>.form-set .dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.form .form-body .form-group .input-group>.form-set .dropdown-menu>li>a,form .form-body .form-group .input-group>.form-set .dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.form .form-body .form-group .input-group>.form-set .dropdown-menu>li>a:focus,.form .form-body .form-group .input-group>.form-set .dropdown-menu>li>a:hover,form .form-body .form-group .input-group>.form-set .dropdown-menu>li>a:focus,form .form-body .form-group .input-group>.form-set .dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.form .form-body .form-group .input-group>.form-set .dropdown-menu>.active>a,.form .form-body .form-group .input-group>.form-set .dropdown-menu>.active>a:focus,.form .form-body .form-group .input-group>.form-set .dropdown-menu>.active>a:hover,form .form-body .form-group .input-group>.form-set .dropdown-menu>.active>a,form .form-body .form-group .input-group>.form-set .dropdown-menu>.active>a:focus,form .form-body .form-group .input-group>.form-set .dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.form .form-body .form-group .input-group>.form-set .dropdown-menu>.disabled>a,.form .form-body .form-group .input-group>.form-set .dropdown-menu>.disabled>a:focus,.form .form-body .form-group .input-group>.form-set .dropdown-menu>.disabled>a:hover,form .form-body .form-group .input-group>.form-set .dropdown-menu>.disabled>a,form .form-body .form-group .input-group>.form-set .dropdown-menu>.disabled>a:focus,form .form-body .form-group .input-group>.form-set .dropdown-menu>.disabled>a:hover{color:#777}.form .form-body .form-group .input-group>.form-set .dropdown-menu>.disabled>a:focus,.form .form-body .form-group .input-group>.form-set .dropdown-menu>.disabled>a:hover,form .form-body .form-group .input-group>.form-set .dropdown-menu>.disabled>a:focus,form .form-body .form-group .input-group>.form-set .dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none}.form .form-body .form-group .input-group>.form-set>.form-control,form .form-body .form-group .input-group>.form-set>.form-control{border-radius:0}.form .form-body .form-group.hd,.form .form-body .form-group>.hd,form .form-body .form-group.hd,form .form-body .form-group>.hd{display:none}.form textarea.form-control,form textarea.form-control{height:5rem}.form textarea.form-control[rows],form textarea.form-control[rows]{height:auto}.form .form-control,form .form-control{appearance:none;display:block;width:100%;height:2.5rem;padding:.5rem .8rem;font-size:1rem;line-height:1.42857143;color:#525252;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:.3rem;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;-o-transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;box-sizing:border-box}.form .form-control:focus,form .form-control:focus{border-color:#1b4379;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(27,67,121,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(27,67,121,.6)}.form .form-control:invalid,form .form-control:invalid{border-color:#da6600}.form .form-control:-ms-input-placeholder,.form .form-control::-moz-placeholder,.form .form-control::-webkit-input-placeholder,form .form-control:-ms-input-placeholder,form .form-control::-moz-placeholder,form .form-control::-webkit-input-placeholder{color:#262626;opacity:1}.form .form-control::-ms-expand,form .form-control::-ms-expand{background-color:transparent;border:0}.form .form-control[size],form .form-control[size]{height:auto}.form .form-control[disabled],.form .form-control[readonly],fieldset[disabled] .form .form-control,fieldset[disabled] form .form-control,form .form-control[disabled],form .form-control[readonly]{background-color:#eee;opacity:1}.form .form-control[disabled],fieldset[disabled] .form .form-control,fieldset[disabled] form .form-control,form .form-control[disabled]{cursor:not-allowed}body.div.pgb{-webkit-pointer-events:none;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.div.pgb .pgb-progress{background:#1ab394;position:fixed;z-index:2040;top:0;right:100%;width:100%;height:2px}body.div.pgb .pgb-progress.inactive{display:none}#topbar{display:block;position:absolute;background-color:#1b4379;left:0;right:0;min-height:2.3rem;height:auto;z-index:4}#topbar.hd{height:0!important;min-height:0;overflow:hidden}#topbar.hd~#contentframe,#topbar.hd~#listframe{top:0}#topbar~#contentframe,#topbar~#listframe{top:2.3rem}#topbar>nav{padding-top:0}#contentframe{position:absolute;overflow:auto;top:0;left:0;right:0;bottom:0;z-index:2}#listframe{position:absolute;overflow:auto;top:2.3rem;left:0;right:auto;bottom:0;min-width:20%;max-width:100%;z-index:3;background-color:#fff;border-right:1px solid #1b4379;transition:width 1s,min-width 1s}#listframe.hd:not(.fix){min-width:0;width:0;overflow:hidden}#sidebar~div{left:2.3rem}body>.timer{position:fixed;bottom:3px;height:1px;border-bottom:2px solid #ff0;transition:width 1s linear;left:0}#oci_login{width:600px}#mainmenu{border-bottom:1px solid #ccc}nav{position:relative;left:0;width:100%;display:block;z-index:10000;border-radius:0;min-height:2.3rem;height:2.3rem;max-height:2.3rem;padding-left:0;margin-bottom:0;list-style:none;color:#e3e7e7;background-color:#1b4379}nav.nv{height:100%;max-height:100%;width:2.3rem;max-width:2.3rem}nav.nv ul{min-height:0;min-width:100%}nav.nv ul>li{height:auto;width:100%;padding-top:0;padding-bottom:0}nav.nv ul>li a{width:100%;height:auto;padding:1rem 0}nav.nv ul>li a span.ico{width:100%;height:2.3rem}nav.nv>ul{height:auto}nav #logo{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAADVElEQVRYhe2V309bZRjH+TvovDJbuZkXJsY7Yckpg9pF3QXtKAksxoWZxYEQPWsLtbSW/XDRqcnsYub0YrvxYiNZWTYXIzMQY0xMrHSOtlBKa1vWM3Br2UjP+/HinB1haDxktNzsTb55z8n75D2ffPN8n9PQKMlspxqeAWzVRRZJpsUV4MDhU3T0nmS3w1dfgJ1tHi5cGiefLzGbznFo8DMs9QSw2j2Mjd9CFYJyZYW+oUh9AXa1awBCB+j3bSdAeRscsNq9XIlO6AAP6a83QJPdy+WrE4YD/UMRLLYaAFjbPexxjeDoCeM4qKsnzOtvHufazSmEEFQqK3xw4hscPaPs6xnVavX91e4PeWGfb/MAz9mO4T5ymus3f2IhW6BQVP7RYonCosKDBxUAVFWgKMsUFh+fayreVVjIFTkWOm+4YwrAIskc7PuEzEIBIQRmlhAghFgv4NHqKuEzF9mxGYCX3hhm6ueYdokqyBdKTN9OGYrFk0zHUxSKCgDVapWZZIbYdIJYPMnv8RSx6SSxeJJff7vDUd8XRoOaAuh+52OWlu4DMDef49Dgp+xxjdDcEdDkDNDqDhG9Pmn0gDd8nhZXgFec2nmLM6C9dwTY2eYx3wMWSaZ/KEK5soIQguiNSaztng11Tw6iLZsDFklmYDhCpfIQIQRj47fY9S8ATXYP176bMmJ41Hd2cwBN7V6kziB73SFa3SFsnUGkziCtXSH8J742AKI3pnB0h2l1B7Hp2tsVos93lmyuCIBy7y+6jpw2la6GRknGYpMZ8J8j/scsM4l5ZhJpfZ/nTiJNOvMn1aoKQElZIpHUahKpeV0ZSsqS0e0//PgLL742ZB5gh00mfOYij1ZXn4iQ9mx2qapKMpWh8+2PTNm/zoH3g18yO5cjmyuykF2jXJFCUUFVNQeWl+9vrMkWSKQyfDv2PfvfOm5k3DTA4yZqXhsZ54gm1wi+0a/W9MAkkjuo12k1zc4AL+/383zbxuZ8+hTYZN71RyiXtRhevjpBk9276Q89VQwH/eco6w5ciU5grTfAwBqA/5oDNQb4/0FUW4DhCJXKCqoOYLXXGaD3vc+ZS+fI50tcuDS+7mdSc4BGSWa3w0dH70kOHD5FiytgeshsGUAt9Qzgb8pqydEEvRadAAAAAElFTkSuQmCC) center center/contain no-repeat;margin-right:10px;height:1.9rem;width:1.9rem}nav .nav-header{float:left;position:relative;padding-left:0;margin:0;list-style:none;min-height:100%}nav .nav-header>div{float:left;padding:.4rem 1rem 0 0;line-height:1.4rem;height:100%}nav .nav-header>button,nav .nav-header>div.button{float:left;height:100%;padding:.2rem .8rem;background:0 0;color:inherit;margin-right:1.1rem;box-shadow:none}nav .nav-header .activemodule,nav .nav-header .brand{cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}nav .nav-header .activemodule{color:#fff240;overflow:hidden}@media (min-width:551px){nav .nav-header .activemodule{max-width:calc(100% - 46px);font-size:16px}nav .nav-header .brand{display:inline-block}}@media (max-width:550px){nav .nav-header .brand{display:none}nav .nav-header .activemodule{max-width:calc(100% - 190px);font-size:16px;line-height:28px;padding:0}}@media (min-width:797px){nav .nav-header #mmmb{display:none!important;pointer-events:none}nav ul.nav-right{float:right!important}nav ul.nav-right li.dropdown.submenu>ul{left:auto;right:100%;right:calc(100% + .1rem)}nav ul li[role=separator]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none}nav ul li[role=separator]::before{content:"|";cursor:default;padding:.4rem 1rem 0;line-height:1.4rem;height:100%;display:block;font-weight:400;white-space:nowrap;min-height:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none}}@media (max-width:796px){nav.nv{padding-top:2.3rem}nav.nv>ul{display:none}nav .nav-header{width:100%;position:absolute;top:0;left:0}nav .nav-header #mmmb{float:right;margin-right:0}nav{padding-top:2.3rem}nav.ctxt>ul{width:100%}nav.ctxt>ul>li[role=lbl]{max-width:55vw;white-space:nowrap;overflow:hidden;font-size:85%}nav.ctxt>ul>li>a,nav.ctxt>ul>li>a.fbtn{padding:.4rem .75rem 0}nav.ctxt>ul>li>a>span{display:none}nav.ctxt>ul>li>a>span.caret,nav.ctxt>ul>li>a>span.glyphicon,nav.ctxt>ul>li>a>span.ico{display:inline-block}nav#mainmenu.vis>ul{display:block}nav#mainmenu>ul{padding-bottom:1rem;display:none;width:100%;float:none}nav.vis>ul{height:auto}nav.vis>ul li{width:100%;float:none}nav.vis>ul li[role=separator]{padding:0 1rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none;margin:.3rem 0}nav.vis>ul li[role=separator]::before{content:"";cursor:default;position:relative;width:100%;height:100%;border-bottom:1px solid #e3e7e7;display:block}}nav>ul{height:100%;float:left}nav ul{position:relative;padding-left:0;margin:0;list-style:none;min-height:100%;background-color:inherit}nav ul>li{list-style:none;float:left;position:relative;display:block;padding-left:0;margin-bottom:0;height:100%}nav ul>li.ar{float:right}nav ul>li[role=info],nav ul>li[role=lbl]{color:#fff240;padding:.5rem .5rem 0}nav ul>li a{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;padding:.4rem 1rem 0;line-height:1.4rem;height:100%;display:block;font-weight:400;white-space:nowrap;min-height:inherit}nav ul>li a span+.caret,nav ul>li a span+span{margin-left:.5rem}nav ul>li a span.ico{height:1.1rem;width:1.1rem;background-color:transparent;background-repeat:no-repeat;background-position:center center;background-size:contain;background-clip:content-box;display:inline-block;padding:.15rem}nav ul>li a>.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-right:4px solid transparent;border-left:4px solid transparent}nav ul>li a>.glyphicon{font-size:1.1rem}nav ul>li a[role=button]::after{content:"";position:absolute;top:.2rem;left:.1rem;right:.1rem;bottom:0;border-top:1px solid transparent;border-left:1px solid transparent;border-right:1px solid transparent;border-bottom:none;border-top-left-radius:.2rem;border-top-right-radius:.2rem}nav ul>li a[role=button].fbtn::after,nav ul>li a[role=button]:hover::after{border-color:rgba(227,231,231,.6);border-top-left-radius:.2rem;border-top-right-radius:.2rem}nav ul>li a.disabled{cursor:default;opacity:.5}nav ul>li.dropdown{position:relative}nav ul>li.dropdown.submenu>ul{position:absolute;top:0;left:100%;left:calc(100% + .1rem);right:auto;min-height:inherit}nav ul>li.dropdown>ul{display:none}nav ul>li.dropdown>ul>li{min-height:2.3rem;float:none;display:block}nav ul>li.dropdown.open>ul{display:block}nav ul>li.dropdown.open>a{background-color:rgba(227,231,231,.6);color:#fff}@media (max-width:796px){nav ul>li.dropdown.open>ul{position:fixed;top:5.1rem;top:calc(5.1rem - 2px);left:.5rem;right:.5rem;left:calc(.5rem - 1px);right:calc(.5rem - 1px);height:auto;min-height:25%}}nav ul.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:5px 0;margin:2px 0 0;font-size:1rem;text-align:left;background-color:#1b4379;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}nav ul.dropdown-menu.right{right:0;left:auto}nav ul.dropdown-menu li.divider,nav ul.dropdown-menu li[role=separator]{height:1px;margin:.25rem 0 .7rem;overflow:hidden;background-color:#e5e5e5;min-height:1px;max-height:1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}nav ul.dropdown-menu li.info,nav ul.dropdown-menu li[role=info],nav ul.dropdown-menu li[role=lbl]{color:#ffff4a;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}nav ul.dropdown-menu li>span{padding:.4rem 1rem 0 .4rem;display:inline-block}nav ul.dropdown-menu li a[role=button]::after{border-left:none;border-right:none;border-top-left-radius:0}span.sbc{background-image:url(/ct/img/wave_v.svg)}table.sortable>tr.sortactive>td,tbody.sortable>tr.sortactive>td{background-color:#ffffe0!important;box-shadow:1px 1px 2px rgba(50,50,50,.3)}#contentframe>.edit_frm+.list_frm{display:none}.list_frm{min-height:100%}main nav ul>li a[role=button]::after{border-top:1px solid rgba(227,231,231,.6);border-left:1px solid rgba(227,231,231,.6);border-right:1px solid rgba(227,231,231,.6)}main nav ul>li a[role=button].fbtn::after,main nav ul>li a[role=button]:hover::after{border-color:#e3e7e7}#dashboard_frame{overflow-y:auto;height:100%;width:100%;padding:1rem;background:#ddd;text-align:center}#notification_frame{height:100%;overflow:hidden;display:flex;flex-direction:column;pointer-events:none}.notification_item{position:relative;flex:0 0 2.3rem;height:2.3rem;box-sizing:border-box;display:flex;align-items:center;text-align:left;white-space:nowrap;overflow:hidden;color:#fff;padding:0 2.2rem 0 .85rem;pointer-events:auto}.notification_item.error,.notification_item.warn,.notification_item.warning{color:#ffc801}.notification_item .notification_title{font-weight:700;flex:0 0 auto}.notification_item .notification_title::after{content:":";margin-right:.35rem}.notification_item .notification_message{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.notification_item .notification_close{position:absolute;top:0;right:.45rem;height:100%;border:0;background:0 0;color:inherit;cursor:pointer;font-size:1.2rem;line-height:2.3rem;padding:0 .25rem}.wdg_loading_ind{color:#999;font-size:.8rem;margin-bottom:10px;padding-left:1.3rem;position:relative}.wdg_loading_ind::before{animation:.8s linear infinite wdg_loading_spin;border:2px solid #ddd;border-top-color:#1b4379;border-radius:50%;content:"";height:.85rem;left:0;position:absolute;top:.05rem;width:.85rem}@keyframes wdg_loading_spin{to{transform:rotate(360deg)}}.wdg_frame{background-color:#fff;border:1px solid #ccc;border-radius:6px;box-shadow:1px 2px 8px 0 rgba(140,140,160,.6),-2px -3px 8px 0 #fafafa;display:inline-block;height:300px;margin-bottom:10px;position:relative;width:300px;margin-right:15px;text-align:left;overflow:hidden}.wdg_frame.dbl{width:615px}.wdg_frame.tpl{width:930px}.wdg_frame.tny{width:150px}.wdg_frame.tny .wdg_cnt>.ind label{font-size:80%}.wdg_frame .wdg_hd{border-top-left-radius:inherit;border-top-right-radius:inherit;height:1.5rem;position:relative;background-color:rgba(27,67,121,.85);box-shadow:1px 5px 5px #1b4379 inset;color:#fff;text-align:center;font-size:.8rem;font-weight:700;padding:.3rem .2rem 0;cursor:pointer;margin:-1px -1px 0}.wdg_frame .wdg_hd>*{user-select:none}.wdg_frame .wdg_cnt{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;height:calc(100% - 24px);overflow-x:hidden;overflow-y:auto;padding:0;position:relative}.wdg_frame .wdg_cnt>.ind{text-align:center;padding:1rem;font-size:1.3rem}.wdg_frame .wdg_cnt>.ind.sts_neg>.ind{color:red}.wdg_frame .wdg_cnt>.ind.sts_pos>.ind{color:#56a532}.wdg_frame .wdg_cnt>.ind>.ind{font-size:4rem;margin:3rem 0;text-shadow:.08rem .12rem .35rem rgba(50,50,50,.6);color:#1b4379}.wdg_frame .wdg_cnt .clickable{cursor:pointer}.wdg_frame .wdg_cnt table{border-collapse:collapse;width:100%}.wdg_frame .wdg_cnt table tr:first-child{border:none}.wdg_frame .wdg_cnt table th{background-color:#ccc;padding:2px 4px;font-size:11px;line-height:1.2;border:1px solid transparent;text-align:left}.wdg_frame .wdg_cnt table th:first-child{border-left:none}.wdg_frame .wdg_cnt table th:last-child{border-right:none}.wdg_frame .wdg_cnt table td{padding:2px 4px;font-size:12px;line-height:1.1;border:1px solid #ccc}.wdg_frame .wdg_cnt table td:first-child{border-left:none}.wdg_frame .wdg_cnt table td:last-child{border-right:none}#listframe div.mth,#listframe div.yr{border:1px solid #ccc;background-color:#eee;padding:.4rem .2rem .2rem .35rem;border-radius:.2rem;cursor:pointer;margin:.2rem;position:relative;display:block;white-space:nowrap;min-height:2rem}#listframe div.mth.extra,#listframe div.yr.extra{text-decoration:red underline}#listframe div.mth.ivc+.extra,#listframe div.yr.ivc+.extra{margin-top:.4rem}#listframe div.mth.selected,#listframe div.yr.selected{background-color:#90ee90}#listframe div.mth.selected>div.mfrm,#listframe div.mth.selected>div.wfrm,#listframe div.yr.selected>div.mfrm,#listframe div.yr.selected>div.wfrm{display:block}#listframe div.mth.selected>div.mthdl,#listframe div.mth.selected>div.wthdl,#listframe div.mth.selected>div.ythdl,#listframe div.yr.selected>div.mthdl,#listframe div.yr.selected>div.wthdl,#listframe div.yr.selected>div.ythdl{display:inline-block;cursor:pointer}#listframe div.mth div.mfrm,#listframe div.mth div.wfrm,#listframe div.mth div.yfrm,#listframe div.yr div.mfrm,#listframe div.yr div.wfrm,#listframe div.yr div.yfrm{display:none;position:relative;background-color:#fff;margin:1rem .2rem .2rem 1rem;padding:.15rem;border-radius:.2rem}#listframe div.mth div.mfrm .wk,#listframe div.mth div.wfrm .wk,#listframe div.mth div.yfrm .wk,#listframe div.yr div.mfrm .wk,#listframe div.yr div.wfrm .wk,#listframe div.yr div.yfrm .wk{border:1px solid #ccc;background-color:#eee;padding:.4rem 1.35rem .2rem .35rem;border-radius:.2rem;cursor:pointer;margin:.2rem;position:relative;display:block;white-space:nowrap;min-height:2rem}#listframe div.mth div.mfrm .wk.selected,#listframe div.mth div.wfrm .wk.selected,#listframe div.mth div.yfrm .wk.selected,#listframe div.yr div.mfrm .wk.selected,#listframe div.yr div.wfrm .wk.selected,#listframe div.yr div.yfrm .wk.selected{background-color:#add8e6}#listframe div.mth div.mfrm .wk.selected div.wkdl,#listframe div.mth div.wfrm .wk.selected div.wkdl,#listframe div.mth div.yfrm .wk.selected div.wkdl,#listframe div.yr div.mfrm .wk.selected div.wkdl,#listframe div.yr div.wfrm .wk.selected div.wkdl,#listframe div.yr div.yfrm .wk.selected div.wkdl{display:inline-block;cursor:pointer}#listframe div.mthdl,#listframe div.wkdl,#listframe div.yrdl{height:1.5rem;width:1.5rem;display:none;background-color:#fff;position:absolute;right:.4rem;border:1px solid #ccc;border-radius:.2rem;padding:.1rem;top:.18rem;font-size:1rem;text-align:center}.invfrm table.invtbl,.invfrm>table{border-collapse:separate;border-spacing:0;margin:2rem}.invfrm table.invtbl th,.invfrm>table th{padding:.2rem .35rem;border:1px solid #ccc;text-align:left}.invfrm table.invtbl td.currency,.invfrm table.invtbl td.num,.invfrm table.invtbl th.currency,.invfrm table.invtbl th.num,.invfrm>table td.currency,.invfrm>table td.num,.invfrm>table th.currency,.invfrm>table th.num{text-align:right;white-space:nowrap}.invfrm table.invtbl td.keep,.invfrm table.invtbl th.keep,.invfrm>table td.keep,.invfrm>table th.keep{white-space:nowrap}.invfrm table.invtbl td,.invfrm>table td{padding:.2rem .35rem;border:1px solid #ccc;vertical-align:top;position:relative}.invfrm table.invtbl td.hl,.invfrm>table td.hl{background-color:#ffffe0}.invfrm table.invtbl td input,.invfrm table.invtbl td select,.invfrm>table td input,.invfrm>table td select{display:none}.invfrm table.invtbl td.raux,.invfrm>table td.raux{min-width:5.3rem}.invfrm table.invtbl td>.ttip,.invfrm>table td>.ttip{display:none;background:#fff;padding:.2rem .35rem;padding:inherit;border:1px solid #ccc;box-shadow:1px 1px 3px rgba(50,50,50,.5);min-width:100%;min-height:100%;border-top-color:#ff4500;z-index:5}.invfrm table.invtbl td .ctw p,.invfrm table.invtbl td .ttip p,.invfrm>table td .ctw p,.invfrm>table td .ttip p{margin:0 0 .1rem}.invfrm table.invtbl td:hover,.invfrm>table td:hover{border-top-color:#ff4500!important;border-top-width:2px}.invfrm table.invtbl td:hover>.ttip,.invfrm>table td:hover>.ttip{display:block;position:absolute;top:0;height:auto;width:auto;left:0}.invfrm table.invtbl tr:nth-child(2n+1) td,.invfrm>table tr:nth-child(2n+1) td{background-color:rgba(150,150,150,.2)}.invfrm table.invtbl tr:nth-child(2n+1) td.hl,.invfrm>table tr:nth-child(2n+1) td.hl{background-color:#ffffe0}.invfrm table.invtbl tr.selected td,.invfrm>table tr.selected td{background-color:#add8e6}.invfrm table.invtbl tr.selected td.hl,.invfrm>table tr.selected td.hl{background-color:#ffffe0}.invfrm table.invtbl tr.selected td .ilbtn,.invfrm>table tr.selected td .ilbtn{display:inline-block}.invfrm .ovhd{display:block;font-size:1.5rem;margin:1rem 2rem;font-weight:700;text-decoration:underline;text-decoration-style:double}.invfrm .ovhd>span{display:block}.invfrm .ovhd>span:first-child{text-decoration:underline;text-decoration-style:double}.invfrm .ovhd>span+span{margin-top:.5rem}.invfrm .ovhd>span.note{font-size:1rem;font-weight:400;text-decoration:none;text-decoration-style:none}.invfrm.mdw .ovhd{text-decoration-color:#add8e6}.invfrm.mdm .ovhd{text-decoration-color:#90ee90}.ilbtn{border-radius:.3rem;display:none;padding:.1rem;margin-bottom:0;font-size:1.5rem;letter-spacing:.025rem;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-color:#fff;background-image:none;border:1px solid #ababab;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-box-shadow:1px 1px 3px rgba(50,50,50,.3);box-shadow:1px 1px 3px rgba(50,50,50,.3);min-width:2.4rem} \ No newline at end of file diff --git a/Fuchs/wwwroot/web/fis.req.de.js b/Fuchs/wwwroot/web/fis.req.de.js index 0eca6e4..3c95604 100644 --- a/Fuchs/wwwroot/web/fis.req.de.js +++ b/Fuchs/wwwroot/web/fis.req.de.js @@ -160,6 +160,8 @@ let $ict = { ivE: 'Die Email-Adresse ist vermutlich nicht gültig.', ivEc: '\nMöchten Sie fortfahren?', pna: 'Diese Seite ist in der Vorschau nicht verfügbar', + bdLbl: 'Rechnungsdatum auf den letzten Werktag des Vormonats setzen ({0})', + bdTT: 'Nur möglich, solange im neuen Monat noch keine Rechnung erstellt wurde. Rechnungsnummer und Fälligkeit richten sich nach diesem Datum.', tpe: 'Die Anzahl von {0} Seiten wird aktuell nicht unterstützt', eis: 'Der Rechnungsentwurf konnte nicht gespeichert werden.', pvw: 'Das Dokument wird abgerufen und für die Vorschau aufbereitet.\nDer Vorgang kann bis zu 2 Minuten dauern.', @@ -955,6 +957,14 @@ $inv.d = { l.rC('freeze'); let c = $$.dc('imagecollection pdfpreview'), vhr = Math.round(vh() * 0.88), total = response.total; if (total > 10) { $$.dc('note warn', c).text($ict.tpe); } + /* Admin-only (fds_inv > 2, decided server-side): date the invoice to the last working day of + the previous month, offered only until an invoice has been created in the new month (ADR 0032). */ + let bdChk = null; + if ((response.backdate || '') !== '') { + let bdRow = $('').addClass('backdate').attr('title', $ict.bdTT).appendTo(c); + bdChk = $('').appendTo(bdRow); + $$.s(string($ict.bdLbl, [response.backdate.split('-').reverse().join('.')])).appendTo(bdRow); + } $.each(response.img || [], (ii, img) => { $$.dc('pdfp', c).append($$.img(img).css('max-height', (vhr - rpx(6)).toString() + 'px')); }); for (let ic = (response.img || []).length + 1; ic <= total; ic++) { $$.dc('pdfp ph', c).append($$.dc('note', $ict.pna)); } $ocms.dlg(c, { @@ -964,7 +974,7 @@ $inv.d = { $ocms.postXT({ url: $ocms.url('inv/dsave'), data: { token: t }, success: (sv) => { $ocms.postXT({ - url: $ocms.url('req/sconf'), data: { id: sv.invid }, success: (cresp) => { + url: $ocms.url('req/sconf'), data: { id: sv.invid, backdate: (bdChk && bdChk.is(':checked')) ? 1 : 0 }, success: (cresp) => { ct.trigger('modal_close'); if (cresp.hasFile === true) { window.open($ocms.url('req/idoc') + '?id=' + sv.invid, '_blank'); } $inv.d.close(); @@ -1264,7 +1274,7 @@ $inv.cInv2 = function (data) { lihd.append($$.sc('dli').click(function () { $inv.disp(ix.Id, 'inv'); })); } lihd.append($$.sc('nme', ix.DocumentName || ix.Id)); - $$.dc('lidt', ili).append([$$.dc('wda').append([$$.s(fdt(ix.DateCreated, 'dd.MM.yyyy'))]), $$.d().text($ict.iSt[ix.invstatus] || ix.invstatus)]); + $$.dc('lidt', ili).append([$$.dc('wda').append([$$.s(fdt(ix.InvoiceDate || ix.DateCreated, 'dd.MM.yyyy'))]), $$.d().text($ict.iSt[ix.invstatus] || ix.invstatus)]); }); } @@ -1439,13 +1449,16 @@ $inv.ccStInv = function (ev) { // Stornorechnung rif.tbl.children('tbody').each($inv.bdysort); rif.tbl.trigger('fds.inv'); /* trigger calculations */ + }, error: (xhr) => { + alert($t.f1 + (xhr && xhr.status ? xhr.status : '')); }, complete: () => { o.c.trigger('modal_close'); } }); - }, error: () => { + }, error: (xhr) => { if (o) { o.c.trigger('modal_close'); } + alert($t.f1 + (xhr && xhr.status ? xhr.status : '')); } }); }; @@ -1572,13 +1585,16 @@ $inv.cSt = function (data) { rif.tbl.children('tbody').each($inv.bdysort); rif.tbl.trigger('fds.inv'); /* trigger calculations */ + }, error: (xhr) => { + alert($t.f1 + (xhr && xhr.status ? xhr.status : '')); }, complete: () => { o.c.trigger('modal_close'); } }); - }, error: () => { + }, error: (xhr) => { if (o) { o.c.trigger('modal_close'); } + alert($t.f1 + (xhr && xhr.status ? xhr.status : '')); } }); }; @@ -1892,7 +1908,7 @@ $inv.rrw = function () { } else if (rw.is('.itm.osum') === true) { co = { invrqid: dta.InvRqId, id: 'osum' + rw.index(), typ: 'osum', p: '', q: null, t: oHtml(dta.tbl.tbl), tt: null, v: null, vt: dta.net_val, vs: dta.svcnet_val, vat: dta.vat, vv: dta.vat_val, vsv: dta.svcvat_val, det: false }; } else { - co = { invrqid: dta.InvRqId, id: dta.Id || '', typ: dta.Type || 'other', p: '', q: null, t: '', tt: null, v: null, vt: dta.net_val, vs: dta.svcnet_val, vat: dta.vat, vv: dta.vat_val, vsv: dta.svcvat_val, det: (dta.Note || '') !== '' && hn === false, SetItmId: dta.SetItmId || null, lvl: (dta.lvl || 0) }; + co = { invrqid: dta.InvRqId, id: dta.Id || '', typ: dta.Type || 'other', p: '', q: null, t: '', tt: null, v: null, vt: dta.net_val, vs: dta.svcnet_val, vat: dta.vat, vv: dta.vat_val, vsv: dta.svcvat_val, det: (dta.Note || '') !== '' && hn === false, SetItmId: dta.SetItmId || null, lvl: (dta.lvl || 0), ref: dta.reference_InvId || null }; $$.dc('ibtn ico move', axf, { title: $rct.mR }); /* should be the last added */ /* dta.position is '' (not unset) for a Text/Title row once invSumUpdate has numbered the diff --git a/Fuchs/wwwroot/web/fis.req.de.min.js b/Fuchs/wwwroot/web/fis.req.de.min.js index 6e684b6..59a6b3a 100644 --- a/Fuchs/wwwroot/web/fis.req.de.min.js +++ b/Fuchs/wwwroot/web/fis.req.de.min.js @@ -1 +1 @@ -let $rct={mdl:"Aufträge",or:"offene Aufträge",orr:"offene Aufträge (4 W)",rn:"Auftragsnummer",iov:{all:"Auftragsübersicht (alle)","":"Auftragsübersicht"},wk:"Woche",nd:"Keine Daten gefunden.",h:"Uhr",rq1:"Auftragsdaten werden von MFR abgerufen.\nDer Vorgang kann bis zu 90Sek dauern.",rq2:"Auftragsdaten werden geladen",rq1f:"Die Auftragsdaten von MFR konnten nicht oder nicht schnell genug abgerufen werde.\nMöchten Sie mit den bestehenden Daten trotzdem weitermachen?",note1:"Im Bruttobetrag sind {0} Lohnkosten enthalten (netto {1}). Die darin enthaltene Umsatzsteuer beträgt {2}.",note2:"Bitte beachten Sie, nach §14 Abs. 1 Umsatzsteuergesetz ist diese Rechnung ein Zahlungsbeleg oder eine andere beweiskräftige Unterlage für 2 Jahre nach Ablauf des Kalenderjahres der Ausstellung dieser Rechnung aufzubewahren, soweit nicht aufgrund anderer gesetzlicher Regelungen andere ggf.längere Aufbewahrungsfristen gelten.",note3:"Privathaushalten erstattet das Finanzamt bis zu {0} des Arbeitslohns mit der nächsten Steuererklärung.",note4:"Für bereits erbrachte Arbeiten, Dienstleistungen, Materiallieferungen und getätigte Bestellvorgänge zum oben genannten Bauvorhaben, die sich aus dem mit Ihnen geschlossenen Vertrag ergeben, stellen wir Ihnen vertragsgemäß unsere Akontozahlung in Rechnung. Eine Endabrechnung erhalten Sie als Schlussrechnung nach Abschluss des gesamten Bauvorhabens. Das Ausführungsdatum entnehmen Sie bitte dem Schlusstext dieser Rechnung. Wir danken Ihnen herzlich für das entgegengebrachte Vertrauen und bitten Sie um kurzfristigen Ausgleich der Akontorechnung.",note13b:"Gem. §13b Umsatzsteuergesetz unterliegen Sie der Steuerschuldnerschaft des Leistungsempfängers zur Umsatzsteuer aus dieser Rechnung mit einem Steuersatz von 19%.",crI:"Rechnung erstellen",crII:"Abschlagsrechnung erstellen",dII:"Für eine Abschlagsrechnung darf nur ein Auftrag gewählt werden.",dnS:"Für eine Rechnung muss mindestens ein Auftrag gewählt werden.",inv:"Rechnung",invs:"Rechnungen",req:"Auftrag",provP:"Leistungszeitraum",provD:"Leistungsdatum",cP:"Position ändern",iRb:"Zeile darunter einfügen",dR:"Zeile löschen",sV:"USt festlegen",cD:"Löschen?",mR:"Zeile verschieben",ctxM:"Weitere Aktionen",noteToggle:"Notiz ein-/ausblenden",sectionTitleEditTT:"Auftragsbezeichnung ändern",svcPart:"Service-Anteil",vat:"Umsatzsteuer",combP:"Positionen zusammenfassen",toSetP:"Auf Setpreis umstellen (Positionen ohne Preis)",toSetPc:"Der Set-Preis wird auf die Summe seiner Positionen gesetzt und die Positionen selbst verlieren ihren Preis. Das ist nicht rückgängig zu machen (der Betrag kann danach nur noch manuell geändert werden). Fortfahren?",toSetMc:"Jedes Set erhält die Summe seiner Positionen als Set-Preis; die Positionen des Sets werden ohne Preis dargestellt bzw. ausgeblendet. Positionen ausserhalb eines Sets bleiben unverändert einzeln aufgeführt. Das ist nicht rückgängig zu machen (die Set-Preise können danach nur noch manuell geändert werden). Fortfahren?",toSetMn:'Diese Rechnung enthält kein Set. Legen Sie zuerst über "Set-Struktur bearbeiten" ein Set an bzw. ordnen Sie Positionen einem Set zu.',iSum:"Zwischensumme",dtRel:"Freigegeben am: ",dtCr:"Erstellt am: ",rqV:"USt des Auftrags?",cthd:"wirklich aus-/einblenden ?",cst:{style:"currency",currency:"EUR"},sts:{IsWorkDone:"Arbeiten erledigt",Closed:"Auftrag geschlossen",SubcontractorPendingConfirmation:"Warten auf Bestätigung (Unterauftrag)",Scheduled:"Geplant",OfferIsRejected:"Angebot abgelehnt",OfferIsSend:"Offen (Angebot versandt)",CollaborationWaitingConfirmation:"Warten auf Bestätigung (Zusammenarbeit)",Released:"Freigegeben",OfferIsConfirmed:"Bestätigt",InProgress:"In Bearbeitung",ReadyForScheduling:"Zur Planung",Created:"Erstellt",Rejected:"Abgebrochen",Invoiced:"Rechnung gestellt","-":"-"},invHR:["Pos.","Menge","Artikelbezeichnung","VK","Summe"],frm:{invoicetitle:"Titel",invoiceaddress:"Adresse",loc:"Leistungsort / Lieferadresse",invoiceemail:"Email",invoiceemailcc:"Zusatzempfänger (CC)",provisionperiod:"Leistungsdatum / -zeitraum"},frmTT:{invoicetitle:"Rechnungstitel ändern",invoiceaddress:"Rechnungsempfänger-Adresse ändern",loc:"Leistungsort oder Lieferadresse ändern",invoiceemail:"Email-Adresse ändern und zusätzliche Email-Empfänger festlegen",provisionperiod:"Leistungsdatum oder -zeitraum ändern"}},$rcol={req:new fields_definition("Auftrag","Aufträge",[{name:"tags",label:"",type:"string",dfnc:function(e,t){""!==(e||"")&&($(this).aC("tags"),e.split(",").forEach((e=>{""!==e&&$(this).append($$.sc("tag "+e.replace(" ","_").replace("/","_").toLowerCase(),e))})))}},{name:"DateOfCreation",label:"Datum",type:"date",title:function(e){$(this).attr("title",$rct.dtCr+fdt(e.DateOfCreation).ne("-")+" \n"+$rct.dtRel+fdt(e.DateReleased).ne("-"))}},{name:"CustomerName",label:"Kunde (Firma)",type:"string"},{name:"Name",label:"Auftragsname",type:"string"},{name:"ExternalId",label:"Auftragsnummer",type:"string"},{name:"ParentExtenalId",label:"PAuftrag",type:"string"},{name:"InvoiceId",label:"RNummer",type:"string",dfnc:function(e,t){$(this).rwText(e," ").find("span").each((function(){$(this).aC("cla").click({id:$(this).text()},$inv.jdbn)}))}},{name:"State",label:"Status",type:"string"},{name:"WorkDoneAt",label:"Erledigt am",type:"date"},{name:"Description",label:"Beschreibung",type:"html"}]),itm:new fields_definition("Auftragsposition","Auftragspositionen",[{name:"NameOrNumber",label:"Bezeichnung",type:"string"},{name:"Type",label:"Typ",type:"select",required:!0,value:"Text",url:[{value:"Text",label:"Text"},{value:"Equipment",label:"Ausrüstung"},{value:"Material",label:"Material"},{value:"Service",label:"Arbeitsleistung"}],change:function(e){$req.quantChange.call(this,e)}},{name:"quantityhours",label:"Anzahl / Menge",type:"number",precision:"0.01",value:1,change:function(e){$inv.quantChange.call(this,e)}},{name:"UnitString",label:"Einheit",type:"select",url:["LFDM","Stck","Std.","QM","AW","Pauschal"],change:function(e){$inv.quantChange.call(this,e)}},{name:"net",label:"EinzelPreis netto",type:"number",precision:"0.01",value:0,change:function(e){$inv.quantChange.call(this,e)}},{name:"net_val",label:"GesamtPreis netto",type:"number",precision:"0.01",value:0},{name:"vat_val",label:"GesamtPreis USt",type:"number",precision:"0.01",value:0},{name:"svcnet_val",label:"Arbeitslohn netto",type:"number",precision:"0.01",value:0},{name:"svcvat_val",label:"Arbeitslohn USt",type:"number",precision:"0.01",value:0},{name:"net_pos",label:"Netto",type:"string"},{name:"bo_pos",label:"Brutto",type:"string"},{name:"vat",label:"USt",type:"string",value:"19,0%",change:function(e){$inv.quantChange.call(this,e)}},{name:"Note",label:"Details",type:"html",tinymce:!0}])},$ict={mdl:"Rechnungen",iov:{all:"Rechnungen (alle)","":"Rechnungen (nur fertige)","#d":"Rechnungen (nur Entwürfe)","#u":"Rechnungen (nur unbezahlt)","#r":"Rechnungen (nur angemahnt)","#a":"Rechnungen (nur Akonto)","#c":"Rechnungen (nur Storno)","#ru":"Rechnungen (nur angemahnt + unbez.)"},uba:", gesamter Zeitraum)",req:"Auftrag",inv:"Rechnung",rem:"Mahnung",in:"Rechnungsnummer",cc:"Kunde",wk:"Woche",nd:"Keine Daten gefunden.",dl:"Herunterladen",ed:"Bearbeiten",ced:"Bearbeitung fortsetzen",sItm:"Einzelheiten anzeigen",sPay:"Zahlungen anzeigen",cdI:"Entwurf der Rechnung löschen?",rel:"Neu Laden",relm:"Bitte laden Sie Liste manuell neu, um die Änderungen zu sehen.",dsp:"Rechnung anzeigen",storno:"Storno-Rechnung erstellen",credit:"Gutschrift erstellen",remd:"Mahnung erstellen",remdt:"Mahnung erstellen zur Rechnung {0}",remlst:"Mahnungen anzeigen",remdsp:"Mahnung anzeigen",remres:"Mahnung erneut senden",remresc:"Mahnung {0} wirklich erneut senden?",remresr:"Mahnung {0} wurde erfolgreich versandt.",setpyd:"Bezahlt markieren",cpyd:"Rechnung wirklich als bezahlt markieren?",setupd:"Bezahlt-Markierung aufheben",cupd:"Bezahlt-Markierung wirklich aufheben?",ivE:"Die Email-Adresse ist vermutlich nicht gültig.",ivEc:"\nMöchten Sie fortfahren?",pna:"Diese Seite ist in der Vorschau nicht verfügbar",tpe:"Die Anzahl von {0} Seiten wird aktuell nicht unterstützt",eis:"Der Rechnungsentwurf konnte nicht gespeichert werden.",pvw:"Das Dokument wird abgerufen und für die Vorschau aufbereitet.\nDer Vorgang kann bis zu 2 Minuten dauern.",pvf:"Die PDF-Vorschau konnte nicht erstellt werden.",pvto:"Der Server hat nicht rechtzeitig geantwortet (Zeitüberschreitung). Bitte versuchen Sie es erneut.",pvgone:"Der Entwurf ist auf dem Server nicht mehr vorhanden (Sitzung abgelaufen). Bitte öffnen Sie den Entwurf erneut.",iss:"Zwischenstand speichern.",p13b:"USt -> §13b",setm:"Set-Preisanzeige",setmo:{setprice:"Set mit Preis – Positionen ohne Preis",setonly:"Nur Set mit Preis – Positionen ausgeblendet"},setst:"Set-Struktur bearbeiten",setsHint:'Reihenfolge: Zeile per Drag & Drop an den oberen/unteren Rand einer anderen Zeile ziehen (davor/danach) oder ▲▼ nutzen. Zuordnung: Zeile auf die Mitte eines Sets ziehen (hinein) bzw. auf die Auftragszeile oder "oberste Ebene" (aus dem Set lösen); ◀▶ ändert die Ebene. Sets lassen sich über das Dreieck zu-/aufklappen und auch zugeklappt verschieben – ihre Positionen wandern mit. Änderungen werden sofort übernommen.',setsUp:"Nach oben (innerhalb der Ebene)",setsDown:"Nach unten (innerhalb der Ebene)",setsCollapse:"Set zuklappen",setsExpand:"Set aufklappen",setsHR:["","Pos.","Typ","Menge","Bezeichnung","Reihenfolge / Ebene"],setsRoot:"Hierher ziehen = aus dem Set lösen (oberste Ebene)",setsOut:"Eine Ebene höher (aus dem Set lösen)",setsIn:"Eine Ebene tiefer (dem vorangehenden Set zuordnen)",setsNew:"Neu:",setsInto:"in",setsTop:"oberste Ebene",setsTitle:"Bezeichnung",setsAdd:"Hinzufügen",setsNoTitle:"(ohne Bezeichnung)",settyp:{set:"Set",text:"Text",title:"Text",material:"Material",service:"Arbeitsleistung",equipment:"Ausrüstung",other:"Position",osum:"Zusammenfassung",intinvoiceallocation:"Abschlag",intinvoiceallocationdiff:"Abschlag (offen)"},ctp:"Ansprechpartner festlegen",mfr:"Von MFR neu abrufen",rq1:"Auftragsdaten werden von MFR abgerufen.\nDer Vorgang kann bis zu 90Sek dauern.",rq2:"Auftragsdaten werden geladen",iq1:"Rechnungsdaten werden von MFR abgerufen.\nDer Vorgang kann bis zu 90Sek dauern.",iq2:"Rechnungsdaten werden geladen",sis:"Rechnung als versandt markieren",srs:"Mahnung als versandt markieren",sisc:"Rechnung wirklich als versandt markieren?",srsc:"Mahnung wirklich als versandt markieren?",iSt:{dft:"Entwurf",uns:"nicht versandt",pyd:"bezahlt",cc:"storniert",op:"offen",due:"fällig",ovd:"überfällig",rem:"angemahnt"},rSt:["","Überfällig","2. Mahnung","3. Stufe"],pSt:{a:"Vollst.",p:"Teilz."},ivT:{i:"AbschlagsR.",f:"SchlussR",r:"Rechnung",c:"StornoR."},rovlh:"Übersicht der bisherigen Mahnungen",rovl:["Betreff","Betrag","Betrag gezahlt","fertiggestellt am"],remHR:["Rechnung","vom","Rechnungsbetrag","bereits bezahlt","noch offen"],translatePaymentTerm:e=>(e||"").replace("wd"," Werktagen").replace("d"," Tagen").replace("wk"," Wochen")||"10 Tagen",payi:{account:"Konto",name:"Zahler",text:"Verw.Zweck",InvoiceID:"Rechnung",amount:"Betrag",date:"Datum",manual:"Typ"}},$invcol={datev:new fields_definition("Rechnung","Rechnungen",[{name:"Umsatz (ohne Soll/Haben-Kz)",label:"Umsatz (ohne Soll/Haben-Kz)",type:"string"},{name:"vf",label:"vf",type:"string"},{name:"Soll/Haben-Kennzeichen",label:"Soll/Haben-Kennzeichen",type:"string"},{name:"Konto",label:"Konto",type:"string"},{name:"Gegenkonto",label:"Gegenkonto",type:"string"},{name:"BU-Schlüssel",label:"BU-Schlüssel",type:"string"},{name:"Belegdatum",label:"Belegdatum",type:"string"},{name:"Belegfeld 1",label:"Belegfeld 1",type:"string"},{name:"Belegfeld 2",label:"Belegfeld 2",type:"string"},{name:"Buchungstext",label:"Buchungstext",type:"string"}]),inv:new fields_definition("Rechnung","Rechnungen",[{name:"invstatus",label:"Status",type:"select",url:$ict.iSt},{name:"balance",label:"Umsatz",type:"string",dtype:"currency"},{name:"CustomerName",label:"Kunde",type:"string"},{name:"InvoiceId",label:"RNummer",type:"string"},{name:"InvoiceType",label:"Typ",type:"select",url:$ict.ivT},{name:"request",label:"Auftrag",type:"string",dtype:"num"},{name:"vat",label:"MwSt",type:"string",dtype:"num"},{name:"deb_cred",label:"Soll/Haben",type:"string"},{name:"customer",label:"Konto",type:"string",dtype:"num"},{name:"contra_account",label:"Gegenkonto",type:"string",dtype:"num"},{name:"Belegdatum",label:"Belegdatum",type:"date"},{name:"reminderstatus",label:"MahnStatus",type:"select",url:$ict.rSt},{name:"reminder",label:"# Mahnungen",type:"integer"},{name:"Buchungstext",label:"Buchungstext",type:"string"},{name:"Payment",label:"Zahlung",type:"string"}]),rem:new fields_definition("Zahlungserinnerung","Zahlungserinnerung",[{name:"amount",label:"Rechnungsbetrag",type:"number",precision:"0.01",value:1},{name:"amount_payed",label:"bereits bezahlt",type:"number",precision:"0.01",value:1}]),rem2:new fields_definition("Zahlungserinnerung","Zahlungserinnerung",[{name:"DocumentName",label:"Name",type:"string"},{name:"subject",label:"Betreff",type:"string"},{name:"DateSent",label:"Versanddatum",type:"date"},{name:"status",label:"Status",type:"string"},{name:"amount_open",label:"offener Betrag",type:"number",precision:"0.01"},{name:"InvoiceId",label:"RNummer",type:"string"}]),rid:new fields_definition("Zahlungserinnerung","Zahlungserinnerung",[{name:"type",label:"Typ",type:"select",url:[["f","einfache Zahlungserinnerung"],["m","Mahnung"],["l","letzte Mahnung"]],required:!0},{name:"level",label:"Stufe",type:"select",url:[["1","Stufe 1"],["2","Stufe 2"],["3","Stufe 3"],["4","Stufe 4"],["5","Stufe 5"],["6","Stufe 6"]],required:!0}]),ctp:new fields_definition("Ansprechpartner","Ansprechpartner",[{name:"name",label:"Name",type:"string"},{name:"email",label:"Email",type:"string"}])},gi=(e,t)=>$$.sc("glyphicon glyphicon-"+e).aC(t),$inv={},$req={init2:function(e,t){e=e||"inv",t=t||{},$ocms.getScript([],(function(){$req.init3(e,t)}))},init3:async function(e,t){$fis.cf(!0);let n=$fis.lf(!0);$("#topbar").ocmsmenu([]),$("#activemodule").text($rct.mdl),await $fis.prepAuth("fds_req,fds_inv,fds_reminder");let i=[(async()=>{!0===$fis.isAuth("fds_req",1)&&($req.prepLst(""),n.aC("fix"))})(),new Promise(((e,t)=>{n.find("div.oreq2").aC("selected"),$req.renderreq(fdt(new Date,"yy-MM-dd"),"r"),e()}))];await Promise.all(i)},prepLst:function(e){let t=new Date,n=$fis.lf(!0).ldng(1),i=new Date("2021-01-01");$fis.frm_list().IN((function(){}));$$.dc("mth oreq",n).text($rct.or).click((function(e){let t=$(this);e.stopPropagation(),t.siblings().rC("selected"),!0===t.is(".selected")&&(t.tC("selected"),$req.renderreq(fdt(new Date,"yy-MM-dd"),"o")),t.aC("selected")})),$$.dc("mth oreq2",n).text($rct.orr).click((function(e){let t=$(this);e.stopPropagation(),t.siblings().rC("selected"),!0===t.is(".selected")&&(t.tC("selected"),$req.renderreq(fdt(new Date,"yy-MM-dd"),"r")),t.aC("selected")})),$$.i({placeholder:$rct.rn}).appendTo($$.dc("mth oreqn",n)).enterKey((function(e){let t=$(this),n=t.val()||"";e.stopPropagation(),t.parent().siblings().rC("selected"),n.length>3&&(t.parent().aC("selected"),$req.renderreq("n:"+n,"s"),t.val(""))}));n.append("
");let r=$$.dc("mthl",n),a=t.getFullYear(),s=t.getMonth()+1;for(let t=i.getFullYear();t<=a;t++){let n=$$.dc("yr").prependTo(r).text($rct.iov[e]+" - "+t.toString()).toggleClass("selected",t===a);n.click({yr:t},(function(e){e.stopPropagation(),n.siblings().rC("selected"),n.aC("selected")}));let l=$$.dc("mfrm",n);for(let n=0;n<(t!==a?12:s);n++){i=new Date(t,n,1);let r=$$.dc("mth").prependTo(l).text($rct.iov[e]+" - "+fdt(i,"MMM yyyy"));r.click({yr:t,mt:n},(function(e){if(e.stopPropagation(),r.siblings().rC("selected"),!0===r.is(".selected")){r.tC("selected");let t=fdt(new Date(e.data.yr,e.data.mt,1),"yy-MM-dd");$req.renderreq(t,"m")}r.aC("selected")}));let a=getMonday(i),s=new Date(i);s.setMonth(s.getMonth()+1),s.setDate(0),s=getMonday(s);let d=$$.dc("wfrm",r);for(;a<=s;){let e=$$.dc("wk",d).text(($rct.wk||"W")+" "+fdt(a,"dd.MM.yy"));e.click({rd:new Date(a)},(function(t){t.stopPropagation();let n=fdt(t.data.rd,"yy-MM-dd");$req.renderreq(n,"w"),r.siblings().rC("selected").find(".wk").rC("selected"),r.aC("selected").find(".wk").rC("selected"),e.aC("selected")}));let t=$$.dc("wkdl",e).append($$.sc("ico glyphicon glyphicon-compressed"));!0===$fis.isAuth("fds_inv",2)&&t.click({rd:new Date(a)},(function(e){e.stopPropagation();let t=fdt(e.data.rd,"yy-MM-dd");$req.downloadzip.call(t,"w")})),a.setDate(a.getDate()+7)}}}n.ldng(0)},renderreq:function(e,t){let n=$fis.frm_list().ldng(1),i=$$.dc("invfrm",n).aC("md"+t),r=$fis.lf();$ocms.postXT({url:$ocms.url("req/reql"),data:{mode:t,tgt:e},success:n=>{r.rC("fix").aC("hd"),$$.dc("ovhd",i).append($$.s(n.admin.title)).appendIf($$.sc("note",n.admin.note),""!==ne(n.admin.note,""));let a=$$.tblset({},i),s=$rcol.req,l=$$.tr(a.hd);$$.th(l);$.each(s.fields||[],((e,t)=>{$$.th(l).text(t.label),"vat"===t.name&&$$.th(l)}));let d=0,c=!1;$.each(n.requests||[],((n,l)=>{d>0&&d!==l.ParentServiceRequestId&&(c=!c);let o=$$.tr(a.bdy).tC("alt",c);d=l.ParentServiceRequestId,o.click((function(){r.rC("fix").aC("hd"),o.tC("selected").siblings().rC("selected").find("td.av").rC("av"),o.find("td.av").rC("av")})),o.tC("child",l.isChild);let u=$$.td(o,{class:"raux"});!0===bool(l.open,!1)&&$$.dc("ihd ilbtn",u).append(gi("eye-close","ico")).click({id:l.Id},$req.tHd),$$.dc("iitm ilbtn",u).append(gi("list","ico")).click({id:l.Id},$req.showitm),!0===$fis.isAuth("fds_inv",2)&&$$.dc("invc ilbtn",u).append(gi("edit","ico")).click({id:l.Id},$inv.cInv),$.each(s.fields||[],((n,r)=>{let a=$$.td(o).aC(r.dtype),s=l[r.name];if("function"==typeof r.dfnc)r.dfnc.call(a,s,l);else switch(r.type||""){case"date":a.text(fdt(l[r.name],"dd.MM.yy"));break;case"datetime":a.text(fdt(l[r.name]));break;case"html":a.append($$.dc("ctw").html(s)),a.append($$.dc("ttip").html(s));break;default:a.text(l[r.name])}switch(r.name||""){case"State":a.text($rct.sts[s||"-"]);break;case"Name":a.aC(r.name.toLowerCase());break;case"vat":$$.sel().appendTo($$.td(o,{class:"vsel"})).click((function(e){e.stopPropagation()})).append([$$.opt("19,0 %","19,0 %"),$$.opt("16,0 %","16,0 %"),$$.opt("0,0 %","0,0 %")]).val(l[r.name]).change().change({frm:i,tgt:e,mode:t,id:l.Id,td:a},$req.setvat),a.tC("hl","19"!==l[r.name].substr(0,2)).click((function(e){e.stopPropagation(),$(this).tC("av")}));break;case"balance":a.aC("sh_"+(l.SollHaben||"").toLowerCase());break;case"InvoiceId":a.aC("keep")}switch(typeof r.title){case"function":r.title.call(a,l);break;case"string":a.attr("title",cs.title)}}))}))},complete:()=>{n.ldng(0)}})},tHd:function(e){let t=$(this).closest("tr");e.stopPropagation(),!1!==t.is(".selected")&&confirm($rct.cthd)&&$ocms.postXT({url:$ocms.url("req/rthd"),data:{id:e.data.id},success:n=>{n.id===e.data.id&&!1===bool(n.visible,!0)?(!1===t.is(".tbhd")&&setTimeout((()=>{t.filter(".tbhd").remove()}),15e3),t.aC("tbhd")):n.id===e.data.id&&t.rC("tbhd")}})},showitm:function(e){let t=$(this).closest("tr");if(e.stopPropagation(),!1===t.is(".selected"))return;let n=$$.dc("rfrm").ldng(1);$ocms.postXT({url:$ocms.url("req/pget"),data:{id:e.data.id},success:t=>{$ocms.postXT({url:$ocms.url("req/get"),data:{id:e.data.id,mode:"ful"},success:e=>{if((e.requests||[]).length<1)n.text($rct.nd);else{let t=$$.dc("srq",n),i=$$.tblset({class:"if"},t);$.each(e.requests||[],(function(e,t){e>0&&$$.tr(i.bdy).aC("sep").append($$.td({colspan:6}));let n=$$.tr(i.bdy).aC("title"),r=$rcol.itm.lbl(),a=$inv.worknotes(t);$$.td(n,{colspan:6}).append([$$.s($rcol.req.label_sng),$$.sc("eid",t.ExternalId),$$.sc("nme",fdt(t.WorkDoneAt,"dd.MM.yy")+": "+a.ne(t.Name))]);$$.tr(i.bdy).aC("shd").append([$$.td(),$$.td(r.NameOrNumber),$$.td(r.Type),$$.td(r.net_pos),$$.td(r.bo_pos),$$.td(r.vat)]);$.each(t.items||[],((e,t)=>{t.ServiceRequestId;let n=$$.tr(i.bdy,{id:"itm"+t.Id}).aC(t.Type);$$.td(n).aC("ico"),$$.td(n).text(t.NameOrNumber),$$.td(n).text(t.Type),$$.td(n).aC("currency").text(t.net_pos),$$.td(n).aC("currency").text(t.bo_pos),$$.td(n).aC("num").text(t.vat)}))}))}},error:()=>{n.text($t.t12)},complete:()=>{n.ldng(0)}})},error:()=>{n.text($t.t12),n.ldng(0)}}),$ocms.dlg(n,{width:1e3})}},$$req={init2:$req.init2,auth:{}};export default $$req;$inv.cInv=function(e){let t=$(this).closest("tr");e.stopPropagation(),!1!==t.is(".selected")&&!1!==$fis.isAuth("fds_inv",2)&&$inv.cInv2({id:e.data.id})},$inv.rMn=e=>{let t=[{lbl:$ict.req,itm:[]}];return!0===bool(e,!1)&&!0===$fis.isAuth("fds_inv",2)&&Array.prototype.push.apply(t[0].itm,[{lbl:$rct.crI,fnc:$inv.ccInv,data:{typ:"r"}},{lbl:$rct.crII,fnc:$inv.ccInv,data:{typ:"i"}}]),t.push({lbl:$ict.rel,fnc:$inv.rReload}),$("#topbar").ocmsmenu(t)},$inv.iMnr=e=>{let t=booln(e.isFinal,!0),n=e.Id,i=booln(e.fds,!1),r=[{glyph:"glyphicon-menu-left",fnc:()=>{$fis.frm_edit().remove()}},{lbl:$ict.inv,itm:[]},{lbl:$ict.rem,itm:[]}];return!1===t&&!0===$fis.isAuth("fds_inv",2)?r[1].itm.push({lbl:$ict.ced,fnc:$inv.clCntInv}):!0===$fis.isAuth("fds_inv",1)&&r[1].itm.push({lbl:$ict.dsp,fnc:()=>$inv.disp(n,"inv")}),!0===i&&!0===t&&!0===$fis.isAuth("fds_inv",2)&&(r[1].itm.push({lbl:$ict.storno,fnc:()=>$inv.storno(n,i)}),r[1].itm.push({lbl:$ict.credit,fnc:()=>$inv.credit(n,i)})),!0===t&&!0===$fis.isAuth("fds_reminder",2)&&(r[2].itm.push({lbl:$ict.remd,fnc:()=>$inv.ccRem(n,e.InvoiceId)}),r[2].itm.push({lbl:$ict.remlst,fnc:()=>$inv.dspRem(n)})),!0===t&&!0===$fis.isAuth("fds_reminder",2)&&!1===booln(e.IsSent,!1)&&r[2].itm.push({lbl:$ict.srs,fnc:()=>$inv.srs(n)}),r.push({lbl:$ict.rel,fnc:$inv.rReload}),$("#topbar").ocmsmenu(r)},$inv.iMn=e=>{let t=booln(e.isFinal,!0),n=e.Id,i=booln(e.fds,!1),r=[{glyph:"glyphicon-menu-left",fnc:()=>{$fis.frm_edit().remove()}},{lbl:$ict.inv,itm:[]},{lbl:$ict.rem,itm:[]}];return!1===t&&!0===$fis.isAuth("fds_inv",2)?r[1].itm.push({lbl:$ict.ced,fnc:()=>{$inv.cntInv({id:n})}}):!0===$fis.isAuth("fds_inv",1)&&r[1].itm.push({lbl:$ict.dsp,fnc:()=>$inv.disp(n,"inv")}),!0===$fis.isAuth("fds_inv",2)&&(r[1].itm.push({lbl:$ict.storno,fnc:()=>$inv.storno(n,i)}),r[1].itm.push({lbl:$ict.credit,fnc:()=>$inv.credit(n,i)})),!0===t&&!1===booln(e.IsPayed,!1)?(!0===$fis.isAuth("fds_reminder",2)&&r[2].itm.push({lbl:$ict.remd,fnc:()=>$inv.ccRem(n,e.InvoiceId)}),!0===$fis.isAuth("fds_inv",2)&&r[1].itm.push({lbl:$ict.setpyd,fnc:()=>$inv.setPyd(n)})):!0===t&&!0===booln(e.IsPayed,!1)&&"m"===(e.PaymentStatus||"")&&!0===$fis.isAuth("fds_inv",2)&&r[1].itm.push({lbl:$ict.setupd,fnc:()=>$inv.setUpd(n)}),!0===$fis.isAuth("fds_reminder",2)&&r[2].itm.push({lbl:$ict.remlst,fnc:()=>$inv.dspRem(n)}),!0===t&&!0===$fis.isAuth("fds_inv",2)&&!1===booln(e.IsSent,!1)&&r[1].itm.push({lbl:$ict.sis,fnc:()=>$inv.sis(n)}),!1===i&&r[1].itm.push({lbl:$ict.mfr,fnc:()=>$inv.mfrrel(n)}),$("#topbar").ocmsmenu(r)},$inv.emOpt=()=>"iss,p13b,ctp,setst,setm",$inv.eM=(e,t,n)=>{let i=[];return!0!==booln(e,!1)&&!0!==booln(t,!1)||i.push({glyph:"glyphicon-menu-left",fnc:()=>{$fis.lf(!0),$fis.frm_edit().remove()}}),!0===(n||"").split(",").includes("iss")&&i.push({lbl:$ict.iss,fnc:$inv.ssave}),!0===(n||"").split(",").includes("ctp")&&i.push({lbl:$ict.ctp,fnc:$inv.sctp}),!0===(n||"").split(",").includes("p13b")&&i.push({lbl:$ict.p13b,fnc:$inv.sp13b}),!0===(n||"").split(",").includes("setm")&&i.push({lbl:$ict.setm,fnc:$inv.ssetmode}),!0===(n||"").split(",").includes("setst")&&i.push({lbl:$ict.setst,fnc:()=>$inv.sets.open()}),!0===(n||"").split(",").includes("iss")&&(i.push({lbl:"Änderungshistorie",fnc:()=>$inv.d.history()}),i.push({lbl:"Änderungen verwerfen",fnc:()=>$inv.d.discard()})),!0===booln(e,!1)&&i.push({lbl:$ict.rel,fnc:$inv.rReload}),$("#topbar").ocmsmenu(i)},$inv.pdfPreviewTimeout=12e4,$inv.pdfPreviewFailed=function(e,t){if(11110===(e||{}).internalCode)return void $ocms.login.dlg();let n=((e||{}).internalText||"").trim();""===n&&"timeout"===t&&(n=$ict.pvto),""===n&&410===(e||{}).status&&(n=$ict.pvgone),alert(($ict.pvf||$t.f1)+(""!==n?"\n"+n:""))},$inv.pdfPreviewComplete=function(e,t){return(n,i)=>{t&&t.c.trigger("modal_close"),e&&e.rC("freeze"),"timeout"===i&&$inv.pdfPreviewFailed(n,i)}},$inv.pdfWaitDlg=function(){let e=$ocms.dlg($$.dc("rfrm").ldng(1),{exclusive:!1,zindex_min:50});return e&&e.ft.rwText($ict.pvw),e},$inv.d={tbl:()=>$("div.invoice_layout table.invi"),layout:()=>$("div.invoice_layout"),token:function(){return $inv.d.tbl().data("dtoken")||""},hashes:function(){let e=$inv.d.tbl().data("bai")||[],t={};return $.each(e,((e,n)=>{t[(n.Id||"").toString()]=JSON.stringify(n)})),t},seed:function(e){let t=$inv.d.layout();t.aC("freeze");let n=$ocms.postXT({url:$ocms.url("inv/dopen"),data:{payload:JSON.stringify(e)},success:e=>{$inv.d.tbl().data("dtoken",e.token).data("dver",e.version).data("dhashes",$inv.d.hashes()).data("dorder",$inv.d.order()),$fis.draft.bind(e.token,{onReady:()=>$inv.d.refresh(),onExpiring:e=>$inv.d.warnExpiry(e),onClosed:e=>$inv.d.closed(e)}),$inv.d.refresh()},error:()=>{t.rC("freeze")},complete:()=>{$inv.d.tbl().removeData("dseeding").removeData("dseedpromise")}});return $inv.d.tbl().data("dseedpromise",n),n},refresh:function(e){let t=$inv.d.token();""!==t&&$ocms.postXT({url:$ocms.url("inv/dstate"),data:{token:t},success:t=>{$inv.d.applyState(t),"function"==typeof e&&e(t)},error:e=>{e&&410===e.status&&$inv.d.closed("expired")},complete:()=>{$inv.d.layout().rC("freeze")}})},applyState:function(e){let t=$inv.d.tbl();if(t.length<1)return;let n=t.data("dver");"number"==typeof n&&"number"==typeof e.version&&e.version$$.dc("dnote").aC(e.style||"InvoiceNotes").text(e.text)))},applyItems:function(e,t){let n=e=>void 0===e?null:e;(t||[]).forEach((t=>{if(!t)return;let i=(t.Id||"").toString();if(""===i)return;let r=e.children("tbody").filter(((e,t)=>(($(t).data()||{}).Id||"").toString()===i)).first();if(r.length<1)return;let a=t.itm||[],s={},l=r.find("tr.title").first(),d=l.length?l:null;a.forEach((e=>{let t=(e.id||"").toString();if(""===t)return;s[t]=!0;let i=r.find("#itm"+t).first(),a=i.length<1;a&&(i=$$.tr(r,{id:"itm"+t,class:"itm"}));let l=i.data()||{},c=a||(l.Type||"")!==(e.typ||"")||l.net!==n(e.v)||l.net_val!==n(e.vt)||l.vat_val!==n(e.vv)||l.svcnet_val!==n(e.vs)||l.svcvat_val!==n(e.vsv)||(l.position||"")!==(null!=e.p?e.p:"")||(l.lvl||0)!==(e.lvl||0)||(l.SetItmId||null)!==(null!=e.SetItmId?e.SetItmId:null);$.extend(l,{Id:t,Type:e.typ,net:n(e.v),net_val:n(e.vt),vat_val:n(e.vv),svcnet_val:n(e.vs),svcvat_val:n(e.vsv),vat:e.vat,position:null!=e.p?e.p:"",SetItmId:null!=e.SetItmId?e.SetItmId:null,lvl:e.lvl||0}),a&&$.extend(l,{htmltext:e.t,quantity:e.q}),i.data(l),d?i.prev()[0]!==d[0]&&i.insertAfter(d):r.children().first()[0]!==i[0]&&r.prepend(i),d=i,c&&$inv.rrw.call(i)})),r.find("tr.itm").each(((e,t)=>{let n=(($(t).data()||{}).Id||"").toString();""===n||s[n]||$(t).remove()}))}))},applySetDisplay:function(e,t){e.find("tr.itm").each(((e,n)=>{let i=$(n),r=((i.data()||{}).Id||"").toString();if(""===r||!Object.prototype.hasOwnProperty.call(t,r))return;let a=t[r]||{};i.tC("sethdr",bool(a.h,!1)),!1===bool(a.p,!0)&&i.find("td.currency").text("")}))},sync:function(e){let t=$inv.d.token();if(""===t){let t=$inv.d.tbl().data("dseedpromise");return t?$.when(t).then((()=>$inv.d.sync(e))):$.when()}return $inv.d.layout().aC("freeze"),$ocms.postXT({url:$ocms.url("inv/dpatch"),data:{token:t,delta:JSON.stringify(e)},success:()=>{$inv.d.refresh()},error:e=>{$inv.d.layout().rC("freeze"),e&&410===e.status&&$inv.d.closed("expired")}})},order:function(){return($inv.d.tbl().data("bai")||[]).map((e=>(e.Id||"").toString()))},syncChanged:function(e){let t=e.data("bai")||[],n=e.data("dhashes")||{},i={},r=[],a=[],s=[];$.each(t,((e,t)=>{let a=(t.Id||"").toString(),s=JSON.stringify(t);i[a]=s,n[a]!==s&&r.push(t)})),$.each(n,(e=>{void 0===i[e]&&a.push(e)}));let l=$inv.d.order(),d=e.data("dorder")||[];return e.data("dhashes",i).data("dorder",l),r.forEach((e=>s.push($inv.d.sync({Target:"block.replace",Ref:(e.Id||"").toString(),Value:e})))),a.forEach((e=>s.push($inv.d.sync({Target:"block.remove",Ref:e})))),d.length===l.length&&d.slice().sort().join(",")===l.slice().sort().join(",")&&d.join(",")!==l.join(",")&&s.push($inv.d.sync({Target:"block.order",Value:l})),$.when.apply($,s).promise()},syncField:function(e,t){let n={invoicetitle:"title",invoiceaddress:"address",invoiceemail:"email",invoiceemailcc:"emailcc",loc:"provisionlocation",provisionlocation:"provisionlocation",provisionperiod:"provisionperiod"}[e];n&&$inv.d.sync({Target:n,Value:t})},footer:function(e,t,n){let i=e.children("tfoot").empty();e.nextAll(".fnote").remove();let r=bool(n.p13b,!1),a=(e,t,n)=>$$.tdc("currency",$$.tr(i,{class:n||"tsum"}).append([$$.tdc("aux"),$$.td({colspan:4}).text(e)]),fnum(t,$rct.cst)),s=t=>$$.dc("fnote").insertAfter(e).rwText(t);a("Netto",t.total_net||0),!1===r&&$.each(t.vat||{},((e,t)=>a($rct.vat+" "+e+"%",t,"tvat"))),a("Summe",t.total_gross||0);let l=n.type||"";"i"===l?(s($rct.note2),s($rct.note4)):"c"===l?s($rct.note2):(s(string($rct.note3,[fnum(((t.service_net||0)+(t.service_vat||0))*(n.tax_servicerefund||0),$rct.cst)])).aC("ntax"),s($rct.note2),s(string($rct.note1,[fnum((t.service_net||0)+(t.service_vat||0),$rct.cst),fnum(t.service_net||0,$rct.cst),fnum(t.service_vat||0,$rct.cst)]))),!0===r&&s($rct.note13b)},validation:function(e){let t=$("div.invoice_layout");if(t.length<1)return;let n=t.children(".dvalidation");n.length<1&&(n=$$.dc("dvalidation"),t.prepend(n)),n.empty().tC("hidden",(e||[]).length<1),$.each(e||[],((e,t)=>$$.dc("dvmsg",n).aC(t.severity).text(t.message)))},preview:function(){let e=$inv.d.token();if(""===e)return;let t=$inv.d.layout(),n=($inv.d.tbl().data("new")||{}).invoiceemail||"";!1===$fis.ValidateEmail(n)&&!1===bool(confirm($ict.ivE+$ict.ivEc),!1)||(t.aC("freeze"),$ocms.postXT({url:$ocms.url("inv/dpreview"),data:{token:e},timeout:$inv.pdfPreviewTimeout,success:n=>{t.rC("freeze");let i=$$.dc("imagecollection pdfpreview"),r=Math.round(.88*vh()),a=n.total;a>10&&$$.dc("note warn",i).text($ict.tpe),$.each(n.img||[],((e,t)=>{$$.dc("pdfp",i).append($$.img(t).css("max-height",(r-rpx(6)).toString()+"px"))}));for(let e=(n.img||[]).length+1;e<=a;e++)$$.dc("pdfp ph",i).append($$.dc("note",$ict.pna));$ocms.dlg(i,{size:[r,Math.round(.88*vw())],zindex:50,form:!1,button:$rct.crI,confirm:function(n){let i=$(this);t.aC("freeze"),$ocms.postXT({url:$ocms.url("inv/dsave"),data:{token:e},success:e=>{$ocms.postXT({url:$ocms.url("req/sconf"),data:{id:e.invid},success:t=>{i.trigger("modal_close"),!0===t.hasFile&&window.open($ocms.url("req/idoc")+"?id="+e.invid,"_blank"),$inv.d.close(),$ocms.init("req"),$inv.rReload()},error:()=>{alert($t.f1),i.trigger("modal_close")},complete:()=>{t.rC("freeze")}})},error:()=>{t.rC("freeze"),alert($ict.eis)}})},cancel:function(e){confirm($ict.cdI)&&($inv.d.close(),$inv.rReload())}})},error:$inv.pdfPreviewFailed,complete:$inv.pdfPreviewComplete(t)}))},save:function(){let e=$inv.d.token();if(""===e)return;let t=$inv.d.layout();t.aC("freeze"),$ocms.postXT({url:$ocms.url("inv/dsave"),data:{token:e},success:e=>{$inv.d.tbl().data("invid",e.invid)},error:()=>{alert($ict.eis)},complete:()=>{t.rC("freeze")}})},history:function(){let e=$inv.d.token();""!==e&&$ocms.postXT({url:$ocms.url("inv/dhistory"),data:{token:e},success:e=>{let t=$$.dc("dhist");if((e.history||[]).length<1)$$.dc("note",t).text("Noch keine Änderungen erfasst.");else{let n=$$.tblset({class:"invtbl fullwidth"},t);$$.tr(n.hd).append([$$.th().text("Zeit"),$$.th().text("Feld"),$$.th().text("Alt"),$$.th().text("Neu")]),$.each(e.history,((e,t)=>$$.tr(n.bdy).append([$$.tdc("keep",fdt(t.timestamp)),$$.td().text(t.target),$$.td().text(t.oldValue),$$.td().text(t.newValue)])))}$ocms.dlg(t,{width:800,form:!1})}})},discard:function(){let e=$inv.d.tbl().data("invid")||"";""!==e?!1!==confirm("Alle Änderungen verwerfen und den zuletzt gespeicherten Stand neu laden?")&&($inv.d.close(),$inv.cntInv({id:e})):alert("Es wurde noch kein Zwischenstand gespeichert, der wiederhergestellt werden könnte.")},warnExpiry:function(e){let t=Math.max(1,Math.round((e||0)/60));$fis.notifications.push({severity:"info",title:"Entwurf läuft ab",message:"Der Rechnungsentwurf läuft in etwa "+t+" Minute(n) ab. Bitte zwischenspeichern, sonst gehen die Änderungen verloren."})},closed:function(e){let t=$inv.d.token();$inv.d.tbl().removeData("dtoken"),""!==t&&$fis.draft.release(t),$fis.frm_edit().remove(),$fis.lf(!0),$fis.notifications.push({severity:"error",title:"Entwurf geschlossen",message:"expired"===e?"Der Rechnungsentwurf ist wegen Inaktivität abgelaufen. Nicht gespeicherte Änderungen sind verloren.":"Der Rechnungsentwurf wurde geschlossen."});try{$inv.rReload()}catch(e){}},close:function(){let e=$inv.d.token();""!==e&&($ocms.postXT({url:$ocms.url("inv/dclose"),data:{token:e}}),$fis.draft.release(e)),$inv.d.tbl().removeData("dtoken")}},$inv.rd={tbl:()=>$("div.invoice_layout table.invi"),layout:()=>$("div.invoice_layout"),token:function(){return $inv.rd.tbl().data("rdtoken")||""},seed:function(e){let t=$inv.rd.layout();t.aC("freeze"),$ocms.postXT({url:$ocms.url("rem/dopen"),data:{payload:JSON.stringify(e)},success:e=>{$inv.rd.tbl().data("rdtoken",e.token).data("rdver",e.version),$fis.draft.bind(e.token,{onReady:()=>$inv.rd.refresh(),onExpiring:e=>$inv.rd.warnExpiry(e),onClosed:e=>$inv.rd.closed(e)}),$inv.rd.refresh()},error:()=>{t.rC("freeze")}})},refresh:function(e){let t=$inv.rd.token();""!==t&&$ocms.postXT({url:$ocms.url("rem/dstate"),data:{token:t},success:t=>{$inv.rd.applyState(t),"function"==typeof e&&e(t)},error:e=>{e&&410===e.status&&$inv.rd.closed("expired")},complete:()=>{$inv.rd.layout().rC("freeze")}})},applyState:function(e){let t=$inv.rd.tbl();if(t.length<1)return;let n=t.data("rdver");"number"==typeof n&&"number"==typeof e.version&&e.version{let t=$$[0]("p").aC("dnote intro").rwText(e);r.length?t.insertBefore(r):t.appendTo(n)})),((e||{}).closing||[]).forEach((e=>$$[0]("p").aC("dnote closing").rwText(e).appendTo(n)))},sync:function(e){let t=$inv.rd.token();""!==t&&($inv.rd.layout().aC("freeze"),$ocms.postXT({url:$ocms.url("rem/dpatch"),data:{token:t,delta:JSON.stringify(e)},success:()=>{$inv.rd.refresh()},error:e=>{$inv.rd.layout().rC("freeze"),e&&410===e.status&&$inv.rd.closed("expired")}}))},syncField:function(e,t){if(""===$inv.rd.token())return;let n={subject:"subject",invoiceaddress:"address",invoiceemail:"email",text:"text"}[e];n&&$inv.rd.sync({Target:n,Value:t})},syncAmount:function(e,t){""!==$inv.rd.token()&&($inv.rd.sync({Target:"amount",Value:(null!=e?e:0).toString()}),$inv.rd.sync({Target:"amount_payed",Value:(null!=t?t:0).toString()}))},footer:function(e,t){let n=e.children("tfoot").empty(),i=$$.tr(n,{class:"tsum"}).append([$$.tdc("aux"),$$.td({colspan:4}).text("Offener Betrag")]);$$.tdc("currency",i,fnum(t.amount_open||0,$rct.cst))},validation:function(e){let t=$inv.rd.layout();if(t.length<1)return;let n=t.children(".dvalidation");n.length<1&&(n=$$.dc("dvalidation"),t.prepend(n)),n.empty().tC("hidden",(e||[]).length<1),$.each(e||[],((e,t)=>$$.dc("dvmsg",n).aC(t.severity).text(t.message)))},preview:function(){let e=$inv.rd.token();if(""===e)return;let t=$inv.rd.layout(),n=($inv.rd.tbl().data("new")||{}).invoiceemail||"";!1===$fis.ValidateEmail(n)&&!1===bool(confirm($ict.ivE+$ict.ivEc),!1)||(t.aC("freeze"),$ocms.postXT({url:$ocms.url("rem/dpreview"),data:{token:e},timeout:$inv.pdfPreviewTimeout,success:n=>{t.rC("freeze");let i=$$.dc("imagecollection pdfpreview"),r=Math.round(.88*vh());$.each(n.img||[],((e,t)=>{$$.dc("pdfp",i).append($$.img(t).css("max-height",(r-rpx(6)).toString()+"px"))})),$ocms.dlg(i,{size:[r,Math.round(.88*vw())],zindex:50,form:!1,button:$ict.remd,confirm:function(n){let i=$(this);t.aC("freeze"),$ocms.postXT({url:$ocms.url("rem/dsave"),data:{token:e},success:e=>{$ocms.postXT({url:$ocms.url("rem/conf"),data:{id:e.remid},success:()=>{i.trigger("modal_close"),window.open($ocms.url("rem/idoc")+"?id="+e.remid,"_blank"),$inv.rd.close(),$ocms.init("req"),$inv.rReload()},error:()=>{alert($t.f1),i.trigger("modal_close")},complete:()=>{t.rC("freeze")}})},error:()=>{t.rC("freeze"),alert($t.f1)}})},cancel:function(e){confirm($ict.cdI)&&($inv.rd.close(),$inv.rReload())}})},error:$inv.pdfPreviewFailed,complete:$inv.pdfPreviewComplete(t)}))},save:function(){let e=$inv.rd.token();if(""===e)return;let t=$inv.rd.layout();t.aC("freeze"),$ocms.postXT({url:$ocms.url("rem/dsave"),data:{token:e},success:e=>{$inv.rd.tbl().data("remid",e.remid)},error:()=>{alert($t.f1)},complete:()=>{t.rC("freeze")}})},history:function(){let e=$inv.rd.token();""!==e&&$ocms.postXT({url:$ocms.url("rem/dhistory"),data:{token:e},success:e=>{let t=$$.dc("dhist");if((e.history||[]).length<1)$$.dc("note",t).text("Noch keine Änderungen erfasst.");else{let n=$$.tblset({class:"invtbl fullwidth"},t);$$.tr(n.hd).append([$$.th().text("Zeit"),$$.th().text("Feld"),$$.th().text("Alt"),$$.th().text("Neu")]),$.each(e.history,((e,t)=>$$.tr(n.bdy).append([$$.tdc("keep",fdt(t.timestamp)),$$.td().text(t.target),$$.td().text(t.oldValue),$$.td().text(t.newValue)])))}$ocms.dlg(t,{width:800,form:!1})}})},warnExpiry:function(e){let t=Math.max(1,Math.round((e||0)/60));$fis.notifications.push({severity:"info",title:"Entwurf läuft ab",message:"Der Mahnentwurf läuft in etwa "+t+" Minute(n) ab. Bitte zwischenspeichern, sonst gehen die Änderungen verloren."})},closed:function(e){let t=$inv.rd.token();$inv.rd.tbl().removeData("rdtoken"),""!==t&&$fis.draft.release(t),$fis.frm_edit().remove(),$fis.lf(!0),$fis.notifications.push({severity:"error",title:"Entwurf geschlossen",message:"expired"===e?"Der Mahnentwurf ist wegen Inaktivität abgelaufen. Nicht gespeicherte Änderungen sind verloren.":"Der Mahnentwurf wurde geschlossen."});try{$inv.rReload()}catch(e){}},close:function(){let e=$inv.rd.token();""!==e&&($ocms.postXT({url:$ocms.url("rem/dclose"),data:{token:e}}),$fis.draft.release(e)),$inv.rd.tbl().removeData("rdtoken")}},$inv.cInv2=function(e){let t=$$.dc("rfrm").ldng(1),n=$ocms.dlg(t,{width:1e3});n&&n.ft.rwText($rct.rq1);let i=()=>{$ocms.postXT({url:$ocms.url("req/get"),timeout:60,data:{id:e.id,mode:"r"},success:t=>{t.admin=t.admin||{};let n=$fis.lf(!0).aC("fix").rC("hd");if($fis.frm_edit().IN(),$inv.eM(!0,!0),(t.requests||[]).length<1)n.aC("fix").text($rct.nd);else{$$.dc("lh",n,$rct.mdl);let i=$$.d(),r=$$.ul({class:"rql"}).data({search:e.id,parent:t.admin.parent}).appendTo(n),a={},s=$rcol.req.lbl();$.each(t.requests||[],(function(e,t){let n=$$.li({class:"cli rli"}).data($.extend({},t)).appendTo(r),l=$$.dc("lihd",n).addClass(t.state);!0===booln(t.open,!1)&&l.append($$.sc("cbox").click((()=>{n.tC("checked"),i.find("li").rC("checked"),!0===n.is(".checked")?$inv.rMn(t.open):$inv.eM(!0)}))),l.append([$$.sc("eid",t.ExternalId),$$.sc("nme",t.Name)]),$$.dc("lidt",n).append([$$.dc("rqs").append([$$.s(s.State+": "),$$.s($rct.sts[t.State||"-"])]),$$.dc("ivn").append([$$.s(s.InvoiceId+": "),$$.s(t.InvoiceId||"- -")]),$$.dc("wda").append([$$.s(s.WorkDoneAt+": "),$$.s(fdt(t.WorkDoneAt,"dd.MM.yyyy"))])]),a[t.Id]=n})),(t.inv||[]).length>0&&($$.dc("lh",n,$rct.invs),i=$$.ul({class:"ivl"}).appendTo(n),$.each(t.inv||[],((e,t)=>{let n=$$.li({class:"cli ili"}).data($.extend({},t)).appendTo(i),a=$$.dc("lihd",n).addClass(t.invstatus);!1===booln(t.isFinal,!0)?a.append($$.sc("cbox").click((()=>{""!==(t.Id||"")&&(n.tC("checked").siblings().rC("checked"),r.find("li").rC("checked"),!0===n.is(".checked")?$inv.iMnr(t):$inv.eM(!0))}))):["","dft"].indexOf(t.invstatus)<0&&a.append($$.sc("dli").click((function(){$inv.disp(t.Id,"inv")}))),a.append($$.sc("nme",t.DocumentName||t.Id)),$$.dc("lidt",n).append([$$.dc("wda").append([$$.s(fdt(t.DateCreated,"dd.MM.yyyy"))]),$$.d().text($ict.iSt[t.invstatus]||t.invstatus)])})))}},complete:()=>{n&&n.c.trigger("modal_close")}})};$ocms.postXT({url:$ocms.url("req/pget"),timeout:90,data:{id:e.id},success:e=>{n&&n.ft.rwText($rct.rq2),i()},error:()=>{confirm($rct.rq1f)?(n&&n.ft.rwText($rct.rq2),i()):n&&n.c.trigger("modal_close")}})},$inv.ccInv=function(e){let t=(e.data||{}).typ||"r",n=$fis.lf(),i=n.children("ul.rql"),r=i.data("parent"),a=[];if(i.find("li.rli.checked").each((function(){a.push($(this).data("Id"))})),a.length<1)return void alert($rct.dnS);if("i"===t&&a.length>1)return void alert($rct.dII);let s=$fis.frm_edit(),l=$$.dc("invoice_layout",s).append($$.dc("btn sprev").click($inv.sprev)),d=$fis.cf().width()>l.width()+n.width()+20;n.tC("fix",d).tC("hd",!d),$inv.eM(!1,!0);let c=$$.dc("rfrm").ldng(1),o=$ocms.dlg(c,{width:1e3});o.ft.rwText($rct.rq2),$ocms.postXT({url:$ocms.url("req/iget"),timeout:60,data:{id:r,mode:"ful",typ:t,sel:a.join(",")},success:e=>{let t=$$.dc("srq",l),n=$$.tblset({class:"invi"},t);n.bdy.remove(),n.ft=$$[0]("tfoot"),e.admin=e.admin||{},e.admin.p13b=bool(e.admin.p13b||"",!0===((e.inv||{}).InvoiceOptions||"").split(",").includes("§13b")),n.tbl.data($.extend({new:{},sms:{},itm:{}},{admin:e.admin,companies:e.companies,locations:e.locations}));let i=$$.tr(n.hd).aC("shd").append([$$.th().aC("aux")]);$rct.invHR.forEach((e=>$$.th(i,e))),n.tbl.on("fds.inv",$inv.invSumUpdate),$.each(e.requests||[],(function(t,i){if(0!==(i.Id||0)){let t=$inv.worknotes(i);i.text="i"===e.admin.type?$rct.req+jine([i.ExternalId,i.Name],": ").eine(" ",""):jine([jine([fdt(i.WorkDoneAt,"dd.MM.yy"),i.ExternalId]," - "+$rct.req+" "),t.ne(i.Name)],": \n");let r=$$.tbody(n.tbl).data($.extend({},i));$inv.rendersrq.call(r)}}));let r=$$.tr($$.tbody(n.tbl),{class:"placeholder"}).data({net_val:0,vat_val:0,svcnet_val:0,svcvat_val:0,net:0});$inv.rrw.call(r),n.ft.appendTo(n.tbl);let a,s,d=e.admin||{},c=(e,t,i,r,a)=>{let s=$$.dc("inpfrm",l).aC(e).append("string"==typeof r?$$.dc("ahd",r):r>0?$$.dc("ahd",$rct.frm[i]):null),d=$$.dc("content",s).rwText(t);$$.dc("axf",s).append($$.dc("ibtn edit",{title:$rct.frmTT[i]||$rct.frm[i]}).data("dialog",$rct.frm[i]).append(gi("pencil")).click($.extend({t:d,nme:i,change:e=>{n.tbl.data("new")[i]=e}},a),$inv.eHtml)),n.tbl.data("new")[i]=t};c("tfrm",d.invoicetitle,"invoicetitle",0,null),c("adrfrm",d.invoiceaddress,"invoiceaddress",0,null),c("locfrm","","loc",1,{list:deepCopy(e.locations),lbl:"ref",property:"address"}),$inv.emailFrm(l,n,d.invoiceemail,d.invoiceemailcc),$$.dc("sndfrm",l).append($$.dc("content").text(d.sender)),d.provisionend&&(s=d.provisionstart?$rct.provP:$rct.provD,a=d.provisionstart?fdt(d.provisionstart,"dd.MM.yyyy")+" - "+fdt(d.provisionend,"dd.MM.yyyy"):fdt(d.provisionend,"dd.MM.yyyy")),c("admfrm",a,"provisionperiod",s,1),n.tbl.data("new").CustomValues=d.CustomValues||"",$$.dc("inpfrm ctpfrm",l).text(jObj(d.CustomValues,"contactName")),n.tbl.children("tbody").each($inv.bdysort),n.tbl.trigger("fds.inv"),$inv.eM(!1,!0,$inv.emOpt())},complete:()=>{o.c.trigger("modal_close")}})},$inv.ccStInv=function(e){let t=e.data||{},n=$fis.lf(),i=t.id,r=$$.dc("invoice_layout",$fis.frm_edit()).append($$.dc("btn sprev").click($inv.sprev)),a=$fis.cf().width()>r.width()+n.width()+20;n.tC("fix",a).tC("hd",!a),$inv.eM(!1,!0);let s=$$.dc("rfrm").ldng(1),l=$ocms.dlg(s,{width:1e3});l.ft.rwText($ict.iq1),$ocms.postXT({url:$ocms.url("inv/pget"),timeout:90,data:{id:t.id},success:e=>{l&&l.ft.rwText($ict.iq2),$ocms.postXT({url:$ocms.url("inv/icget"),timeout:60,data:{id:i},success:e=>{let t=$$.dc("srq",r),n=$$.tblset({class:"invi"},t);n.bdy.remove(),n.ft=$$[0]("tfoot"),e.admin=e.admin||{},e.admin.p13b=bool(e.admin.p13b||"",!0===((e.inv||{}).InvoiceOptions||"").split(",").includes("§13b")),n.tbl.data($.extend({new:{},sms:{},itm:{}},{admin:e.admin,companies:e.companies,locations:e.locations}));let i=$$.tr(n.hd).aC("shd").append([$$.th().aC("aux")]);$rct.invHR.forEach((e=>$$.th(i,e))),n.tbl.on("fds.inv",$inv.invSumUpdate),$.each(e.requests||[],(function(t,i){if(0!==(i.Id||0)){let t=$inv.worknotes(i);i.text="i"===e.admin.type?$rct.req+jine([i.ExternalId,i.Name],": ").eine(" ",""):jine([fdt(i.WorkDoneAt,"dd.MM.yy")+t.ne(i.Name)],": ");let r=$$.tbody(n.tbl).data($.extend({},i));$inv.rendersrq.call(r)}}));let a=$$.tr($$.tbody(n.tbl),{class:"placeholder"}).data({net_val:0,vat_val:0,svcnet_val:0,svcvat_val:0,net:0});$inv.rrw.call(a),n.ft.appendTo(n.tbl);let s,l,d=e.admin||{},c=(e,t,i,a,s)=>{let l=$$.dc("inpfrm",r).aC(e).append("string"==typeof a?$$.dc("ahd",a):a>0?$$.dc("ahd",$rct.frm[i]):null),d=$$.dc("content",l).rwText(t);$$.dc("axf",l).append($$.dc("ibtn edit",{title:$rct.frmTT[i]||$rct.frm[i]}).data("dialog",$rct.frm[i]).append(gi("pencil")).click($.extend({t:d,nme:i,change:e=>{n.tbl.data("new")[i]=e}},s),$inv.eHtml)),n.tbl.data("new")[i]=t};c("tfrm",d.invoicetitle,"invoicetitle",0,null),c("adrfrm",d.invoiceaddress,"invoiceaddress",0,null),c("locfrm",d.provisionlocation,"loc",1,{list:deepCopy(e.locations),lbl:"ref",property:"address"}),$inv.emailFrm(r,n,d.invoiceemail,d.invoiceemailcc),$$.dc("sndfrm",r).append($$.dc("content").text(d.sender)),d.provisionend&&(l=d.provisionstart?$rct.provP:$rct.provD,s=d.provisionstart?fdt(d.provisionstart,"dd.MM.yyyy")+" - "+fdt(d.provisionend,"dd.MM.yyyy"):fdt(d.provisionend,"dd.MM.yyyy")),c("admfrm",s,"provisionperiod",l,1),n.tbl.data("new").CustomValues=d.CustomValues||"",$$.dc("inpfrm ctpfrm",r).text(jObj(d.CustomValues,"contactName")),n.tbl.children("tbody").each($inv.bdysort),n.tbl.trigger("fds.inv")},complete:()=>{l.c.trigger("modal_close")}})},error:()=>{l&&l.c.trigger("modal_close")}})},$inv.clCntInv=function(e){let t=$fis.lf(!1),n=[];t.find("li.ili.checked").each((function(){n.push($(this).data("Id"))})),1===n.length&&$inv.cntInv({id:n[0]})},$inv.cntInv=function(e){e=e||{};$fis.lf(!1).rC("fix").aC("hd");let t=$$.dc("invoice_layout",$fis.frm_edit()).append($$.dc("btn sprev").click($inv.sedit));$inv.eM(!1,!0);let n=$$.dc("rfrm").ldng(1),i=$ocms.dlg(n,{width:1e3});i.ft.rwText($rct.rq2),$ocms.postXT({url:$ocms.url("inv/get"),timeout:60,data:{id:e.id},success:e=>{e.admin=e.admin||{};let n=e.inv||{},i=$$.dc("srq",t),r=$$.tblset({class:"invi"},i);r.bdy.remove(),r.ft=$$[0]("tfoot"),r.tbl.data($.extend({invid:n.Id,new:{},sms:{},itm:{},bai:[]},e));let a=$$.tr(r.hd).aC("shd").append([$$.th().aC("aux")]);$rct.invHR.forEach((e=>$$.th(a,e))),r.tbl.on("fds.inv",$inv.invSumUpdate),$.each(e.req||[],(function(e,t){let n=$$.tbody(r.tbl).data($.extend({},t));$inv.rendersrq.call(n)}));let s=$$.tr($$.tbody(r.tbl),{class:"placeholder"}).data({net_val:0,vat_val:0,svcnet_val:0,svcvat_val:0,net:0});$inv.rrw.call(s),r.ft.appendTo(r.tbl);let l=(e,n,i,a,s)=>{let l=$$.dc("inpfrm",t).aC(e).append("string"==typeof a?$$.dc("ahd",a):a>0?$$.dc("ahd",$rct.frm[i]):null),d=$$.dc("content",l).rwText(n);$$.dc("axf",l).append($$.dc("ibtn edit",{title:$rct.frmTT[i]||$rct.frm[i]}).data("dialog",$rct.frm[i]).append(gi("pencil")).click($.extend({t:d,nme:i,change:e=>{r.tbl.data("new")[i]=e}},s),$inv.eHtml)),r.tbl.data("new")[i]=n};l("tfrm",n.InvoiceTitle,"invoicetitle",0,null),l("adrfrm",n.SendToAddress,"invoiceaddress",0,null),l("locfrm",n.ProvisionLocation,"loc",1,null),$inv.emailFrm(t,r,n.SendToEmail,n.SendToEmailCc),$$.dc("sndfrm",t).append($$.dc("content").text(e.admin.sender)),l("admfrm",n.ProvisionPeriod,"provisionperiod",!0===(n.ProvisionPeriod||"").includes("-")?$rct.provP:$rct.provD,1),r.tbl.data("new").CustomValues=n.CustomValues||"",$$.dc("inpfrm ctpfrm",t).text(jObj(n.CustomValues,"contactName")),r.tbl.children("tbody").each($inv.bdysort),r.tbl.trigger("fds.inv"),$inv.eM(!1,!0,$inv.emOpt())},complete:()=>{i.c.trigger("modal_close")}})},$inv.cSt=function(e){e=e||{};let t=$fis.lf(),n=$$.dc("invoice_layout",$fis.frm_edit()).append($$.dc("btn sprev").click($inv.sedit)),i=$fis.cf().width()>n.width()+t.width()+20;t.tC("fix",i).tC("hd",!i),$inv.eM(!1,!0);let r=$$.dc("rfrm").ldng(1),a=$ocms.dlg(r,{width:1e3});a.ft.rwText($ict.iq1),$ocms.postXT({url:$ocms.url("inv/pget"),data:{id:e.id},success:t=>{a&&a.ft.rwText($ict.iq2),$ocms.postXT({url:$ocms.url("inv/storno"),data:{id:e.id,mode:e.mode},success:e=>{e.admin=e.admin||{},e.admin.p13b=bool(e.admin.p13b||"",!0===((e.inv||{}).InvoiceOptions||"").split(",").includes("§13b"));let t=e.inv||{},i=$$.dc("srq",n),r=$$.tblset({class:"invi"},i);r.bdy.remove(),r.ft=$$[0]("tfoot"),r.tbl.data($.extend({invid:t.Id,new:{},sms:{},itm:{},bai:[]},e));let a=$$.tr(r.hd).aC("shd").append([$$.th().aC("aux")]);$rct.invHR.forEach((e=>$$.th(a,e))),r.tbl.on("fds.inv",$inv.invSumUpdate),$.each(e.req||[],(function(e,t){let n=$$.tbody(r.tbl).data($.extend({},t));$inv.rendersrq.call(n)}));let s=$$.tr($$.tbody(r.tbl),{class:"placeholder"}).data({net_val:0,vat_val:0,svcnet_val:0,svcvat_val:0,net:0});$inv.rrw.call(s),r.ft.appendTo(r.tbl);let l=(e,t,i,a,s)=>{let l=$$.dc("inpfrm",n).aC(e).append("string"==typeof a?$$.dc("ahd",a):a>0?$$.dc("ahd",$rct.frm[i]):null),d=$$.dc("content",l).rwText(t);$$.dc("axf",l).append($$.dc("ibtn edit",{title:$rct.frmTT[i]||$rct.frm[i]}).data("dialog",$rct.frm[i]).append(gi("pencil")).click($.extend({t:d,nme:i,change:e=>{r.tbl.data("new")[i]=e}},s),$inv.eHtml)),r.tbl.data("new")[i]=t};l("tfrm",t.InvoiceTitle,"invoicetitle",0,null),l("adrfrm",t.SendToAddress,"invoiceaddress",0,null),l("locfrm",t.ProvisionLocation,"loc",1,null),$inv.emailFrm(n,r,t.SendToEmail,t.SendToEmailCc),$$.dc("sndfrm",n).append($$.dc("content").text(e.admin.sender)),l("admfrm",t.ProvisionPeriod,"provisionperiod",!0===(t.ProvisionPeriod||"").includes("-")?$rct.provP:$rct.provD,1),r.tbl.data("new").CustomValues=t.CustomValues||"",$$.dc("inpfrm ctpfrm",n).text(jObj(t.CustomValues,"contactName")),r.tbl.children("tbody").each($inv.bdysort),r.tbl.trigger("fds.inv")},complete:()=>{a.c.trigger("modal_close")}})},error:()=>{a&&a.c.trigger("modal_close")}})},$inv.adrCountries=[["DE","Deutschland"],["AT","Österreich"],["CH","Schweiz"],["FR","Frankreich"],["NL","Niederlande"],["BE","Belgien"],["LU","Luxemburg"],["IT","Italien"],["ES","Spanien"],["PL","Polen"],["DK","Dänemark"],["CZ","Tschechien"],["GB","Großbritannien"],["US","USA"]],$inv.composeAddress=function(e){let t=[],n=e=>{""!==(e=(""+(e||"")).trim())&&t.push(e)};n((e=e||{}).name),""!==(""+(e.contact||"")).trim()&&n("z.Hd. "+(""+e.contact).trim()),n(e.line2||e.addressLine2),n(e.street),n(((e.postalCode||"")+" "+(e.city||"")).trim());let i=(""+(e.countryCode||"")).toUpperCase();return""!==i&&"DE"!==i&&n(i),t.join("\n")},$inv.adrCurrent=function(e){let t=jObj((e.data("new")||{}).CustomValues,"sendToAddress");if("string"==typeof t&&"{"===t.trim().charAt(0))try{t=JSON.parse(t)}catch(e){t=null}if(t&&"object"==typeof t)return t;let n=(e.data("admin")||{}).invoiceaddressData;if("string"==typeof n&&"{"===n.trim().charAt(0))try{return JSON.parse(n)}catch(e){}else if(n&&"object"==typeof n)return n;return{}},$inv.eAddress=function(e){let t=$inv.d.tbl(),n=$inv.adrCurrent(t),i=[{name:"name",label:"Name / Firma",type:"text",value:n.name||"",required:!0},{name:"contact",label:"z.Hd. (optional)",type:"text",value:n.contact||""},{name:"street",label:"Straße + Nr.",type:"text",value:n.street||""},{name:"line2",label:"Adresszusatz (optional)",type:"text",value:n.line2||n.addressLine2||""},{name:"postalCode",label:"PLZ",type:"text",value:n.postalCode||""},{name:"city",label:"Ort",type:"text",value:n.city||""},{name:"countryCode",label:"Land",type:"select",url:$inv.adrCountries,value:n.countryCode||"DE"},{name:"vatId",label:"USt-IdNr. (nur bei Firmen)",type:"text",value:n.vatId||""},{name:"leitwegId",label:"Leitweg-ID (nur Behörden / B2G)",type:"text",value:n.leitwegId||""}],r=$$.dc("adr-conformity").append([$$.dc("hd").text("Hinweis zur DATEV-/eRechnungs-Konformität"),$$.dc("tx").text("Pflicht: Name, Straße, PLZ, Ort und Land. Die USt-IdNr. nur bei Firmen angeben — für eine Rechnung an eine Privatperson einfach leer lassen. Eine Leitweg-ID nur bei Behörden (B2G) — dann wird die Rechnung automatisch als XRechnung erzeugt.")]);$ocms.dlgform(i,{title:"Rechnungsempfänger",addcontent:r,success:function(t){let n={name:t.name||"",contact:t.contact||"",line2:t.line2||"",street:t.street||"",postalCode:t.postalCode||"",city:t.city||"",countryCode:t.countryCode||"DE",vatId:(""+(t.vatId||"")).trim(),leitwegId:(""+(t.leitwegId||"")).trim()},i=$inv.composeAddress(n);e.data&&e.data.t&&e.data.t.rwText(i),"function"==typeof(e.data||{}).change&&e.data.change(i),$inv.d.sync({Target:"address",Value:n})}})},$inv.provToIso=function(e){let t=(""+(e||"")).match(/(\d{1,2})\.(\d{1,2})\.(\d{4})/);return t?t[3]+"-"+("0"+t[2]).slice(-2)+"-"+("0"+t[1]).slice(-2):""},$inv.eProvisionPeriod=function(e){let t=(""+(e.data&&e.data.t?e.data.t.text():"")).trim().match(/\d{1,2}\.\d{1,2}\.\d{4}/g)||[],n=[{name:"von",label:"Leistungsdatum",type:"date",value:$inv.provToIso(t[0]||"")},{name:"bis",label:"Leistungszeitraum – bis (optional)",type:"date",value:$inv.provToIso(t[1]||"")}],i=$$.dc("adr-conformity").append([$$.dc("hd").text("Leistungsdatum / -zeitraum"),$$.dc("tx").text('Für ein einzelnes Datum nur „Leistungsdatum" ausfüllen; für einen Zeitraum zusätzlich das Bis-Datum. Nur strukturierte Datumsauswahl — für die E-Rechnung empfohlen.')]);$ocms.dlgform(n,{title:"Leistungsdatum / -zeitraum",addcontent:i,success:function(t){let n=(""+(t.von||"")).trim(),i=(""+(t.bis||"")).trim(),r=""===n?"":""===i||i===n?n:n+" - "+i;e.data&&e.data.t&&e.data.t.rwText(r),"function"==typeof(e.data||{}).change&&e.data.change(r),$inv.d.sync({Target:"provisionperiod",Value:r})}})},$inv.eEmail=function(e){let t=[{name:"email",label:$rct.frm.invoiceemail,type:"text",value:(e.data.t||$$.s()).text()},{name:"emailcc",label:$rct.frm.invoiceemailcc,type:"text",value:(e.data.ccT||$$.s()).text()}];$ocms.dlgform(t,{title:$rct.frm.invoiceemail,success:function(t){let n=(""+(t.email||"")).trim(),i=(""+(t.emailcc||"")).trim();e.data&&e.data.t&&e.data.t.text(n),e.data&&e.data.ccT&&e.data.ccT.text(i),"function"==typeof(e.data||{}).change&&e.data.change(n),"function"==typeof(e.data||{}).changeCc&&e.data.changeCc(i),$inv.d.syncField("invoiceemail",n),$inv.rd.syncField("invoiceemail",n),$inv.d.syncField("invoiceemailcc",i),$inv.rd.syncField("invoiceemailcc",i)}})},$inv.emailFrm=function(e,t,n,i){let r=$$.dc("inpfrm emailccfrm",e),a=$$.dc("content",r).rwText(i),s=$$.dc("inpfrm emailfrm",e),l=$$.dc("content",s).rwText(n);$$.dc("axf",s).append($$.dc("ibtn edit",{title:$rct.frmTT.invoiceemail}).append(gi("pencil")).click({t:l,ccT:a,nme:"invoiceemail",change:e=>{t.tbl.data("new").invoiceemail=e},changeCc:e=>{t.tbl.data("new").invoiceemailcc=e}},$inv.eHtml)),t.tbl.data("new").invoiceemail=n,t.tbl.data("new").invoiceemailcc=i},$inv.eHtml=function(e){if(e.data&&!(e.data instanceof jQuery)&&$inv.d&&"function"==typeof $inv.d.token&&""!==$inv.d.token()){if("invoiceaddress"===e.data.nme)return $inv.eAddress.call(this,e);if("provisionperiod"===e.data.nme)return $inv.eProvisionPeriod.call(this,e)}if(e.data&&!(e.data instanceof jQuery)&&"invoiceemail"===e.data.nme&&e.data.ccT)return $inv.eEmail.call(this,e);let t=$(this),n=e.data instanceof jQuery?e.data:e.data.t,i=["invoiceemail","invoiceemailcc","provisionperiod","invoicetitle"].includes(e.data.nme),r=i?[{name:"txt",label:"Text",type:"text",value:n.text()}]:[{name:"txt",label:"Text",type:"html",value:n.html(),tinymce:!0,attr:{style:"height: 300px"}}],a=e.data.change||null,s={title:t.data("dialog")||"",success:function(t){i?n.text(t.txt||""):n.html(t.txt),"function"==typeof a&&a(t.txt),$inv.d.syncField(e.data.nme,i?t.txt||"":t.txt),$inv.rd.syncField(e.data.nme,i?t.txt||"":t.txt)},tinymce:{valid_elements:"br",hidemenu:!0,hidetoolbar:!0}};if(Array.isArray(e.data.list)){let t=$$.dc("lstfrm");$.each(e.data.list,((n,i)=>{let r=$$.dc("li",t).append(""!==(e.data.lbl||"")?$$.dc("lbl").rwText(i[e.data.lbl]):null);$$.dc("adr",r).rwText(i[e.data.property]).data("val",i[e.data.property]).click((function(){let e=$(this),t=e.closest(".modal-body").find(':input[name="txt"]');t.is(".tinymce")?tinymce.get(t.attr("id")).setContent($$.s().rwText(e.data("val")).html()):"TEXTAREA"===t.prop("tagName")?t.val(e.data("val")).change():t.rwText(e.data("val"))}))})),s.addcontent=t}$ocms.dlgform(r,s)},$inv.setVat=function(e){$(this);let t=e.data,n=prompt($rct.rqV);n&&(n=parseFloat(n.replace("%","")),n>1&&(n*=.01),!1===isNaN(n)&&(t.siblings(".itm").each((function(){$(this).data().vat=fnum(n,{style:"percent"}).replace(" ","")})),$inv.t_fds_inv()))},$inv.inRow=function(e){let t=$(this),n=e.data,i={},r=$rcol.itm.clone(["SortOrder","NameOrNumber","Type","quantityhours","UnitString","net","svcnet_val","svcvat_val","net_val","vat_val","vat","Note"]),a="N"+(65536*(1+Math.random())||0).toString(16).substr(6),s=$$.tr({id:"itm_"+a.toString(),class:"itm"});$ocms.dlgform(r,{title:t.data("dialog")||"",success:function(e){s.data($.extend({Id:a},i,e)),$inv.rrw.call(s),s.insertAfter(n),$inv.t_fds_inv()},typedvalues:!0})},$inv.eRow=function(e){let t=$(this),n=e.data,i=n.data()||{},r=["SortOrder","NameOrNumber","Type","quantityhours","UnitString","net","svcnet_val","svcvat_val","net_val","vat_val","vat","Note"];i.id||""!==(i.Type||"")||r.unshift("Type");let a=$rcol.itm.clone(r).applyValues(i);a.set("Type","hidden","type"),$inv.eRw.call(t,n,i,a)},$inv.eRw=function(e,t,n){let i=$(this);$ocms.dlgform(n,{title:i.data("dialog")||"",success:function(n){let i={};""===(t.Id||"")&&(i.Id="N"+(65536*(1+Math.random())||0).toString(16).substr(6),e.attr("id","itm_"+i.Id.toString())),i.quantity=((n.quantityhours||"").toString()+" "+(n.UnitString||"").toString()).trimEnd(),e.data($.extend({},t,n,i)),console.debug("eRw success %o",e.data()),$inv.rrw.call(e),$inv.t_fds_inv()},typedvalues:!0})},$inv.bdysort=(e,t)=>{$(t).Sortable({dragItem:!1,dragHandleClass:"ico",parentident:"tr",onend:()=>{$inv.t_fds_inv()}})},$inv.rowCtxMenu=function(e){let t=$$[0]("nav").aC("rowctx");return t.ocmsmenu([{glyph:"glyphicon-option-vertical",aclass:"ctxbtn",attr:{title:$rct.ctxM},itm:e}]),t.find("li[title]").each((function(){let e=$(this);e.children("a").attr("title",e.attr("title"))})),t},$inv.rrw=function(){let e=$(this),t=e.data(),n={},i=e.is(".placeholder"),r=e.is(".hidenote"),a=e=>$$.d().append(e).html(),s=[{lbl:$rct.iRb,attr:{title:$rct.iRb},data:e,fnc:$inv.inRow}];!1===i&&(s.unshift({lbl:$rct.cP,attr:{title:$rct.cP},data:e,fnc:$inv.eRow}),s.push({lbl:$rct.dR,attr:{title:$rct.dR},fnc:function(t){confirm($rct.cD)&&(e.remove(),$inv.t_fds_inv())}}),"set"===(t.Type||"").toLowerCase()&&0===(t.net_val||0)&&s.push({lbl:$rct.toSetP,attr:{title:$rct.toSetP},data:e,fnc:$inv.toSetPrice}));let l=$$.dc("axf").append($inv.rowCtxMenu(s));!0===i?n={id:"",typ:"placeholder"}:!0===e.is(".itm.osum")?n={invrqid:t.InvRqId,id:"osum"+e.index(),typ:"osum",p:"",q:null,t:a(t.tbl.tbl),tt:null,v:null,vt:t.net_val,vs:t.svcnet_val,vat:t.vat,vv:t.vat_val,vsv:t.svcvat_val,det:!1}:(n={invrqid:t.InvRqId,id:t.Id||"",typ:t.Type||"other",p:"",q:null,t:"",tt:null,v:null,vt:t.net_val,vs:t.svcnet_val,vat:t.vat,vv:t.vat_val,vsv:t.svcvat_val,det:""!==(t.Note||"")&&!1===r,SetItmId:t.SetItmId||null,lvl:t.lvl||0},$$.dc("ibtn ico move",l,{title:$rct.mR}),n.p=null!=t.position?t.position:t.SortOrder||"",""===n.id?n.t="":["Text","Title"].includes(n.typ)&&0===(t.net_val||0)?n.t=t.htmltext||("#"!==(t.NameOrNumber||"").substr(0,1)?a($$[0]("p").text(t.NameOrNumber)):"")+(t.Note||""):(n.tt=n.det?"":$$.s(t.Note||"").text(),n.q=t.quantity||(0!==(t.quantityhours||0)?fnum(t.quantityhours)+" "+(t.UnitString||""):""),n.t=t.htmltext||(n.det?a($$.s(t.NameOrNumber||""))+a($$.dc("desc").html(t.Note)):a($$.s(t.NameOrNumber||""))),n.v=t.net,n.vt=t.net_val)),""!==(t.Note||"")&&$$.dc("ibtn add",l,{title:$rct.noteToggle}).append(gi("object-align-left")).click((function(t){$inv.rrw.call(e.tC("hidenote"))}));let d=[$$.tdc("aux").append(l),$$.tdc("keep").text(n.p)];if(""===n.id)d.push($$.td(e,{colspan:4}).append(n.t));else{Array.prototype.push.apply(d,n.q?[$$.tdc("keep").text(n.q)]:[]);let e=e=>null==e?"":fnum(e,$rct.cst);Array.prototype.push.apply(d,[$$.tdc("txt",{colspan:n.q?1:2,title:n.tt}).append(n.t),$$.tdc("currency").text(e(n.v)),$$.tdc("currency inetval").text(e(n.vt)).attr("title",$rct.svcPart+": "+e(n.vs))])}e.empty().attr("class",i?"placeholder":"itm").aC(n.Typ).tC("sethdr","set"===(n.typ||"").toString().toLowerCase()).aC((n.lvl||0)>0?"lvl"+Math.min(n.lvl,6):"").tC("hidenote",r).append(d),t.co=n},$inv.toSetPrice=function(e){let t=(e.data.data().Id||"").toString();""!==t&&!1!==confirm($rct.toSetPc)&&$.when($inv.t_fds_inv()).done((()=>{$inv.d.sync({Target:"item.setprice",Ref:t})}))},$inv.invSumUpdate=function(){let e=$(this),t=[],n=e.children("tbody"),i=[];n.each(((e,n)=>{let r=$(n),a=r.data()||{},s=[],l=[],d=r.find("tr.itm");r.tC("empty",d.length<1),d.each(((e,t)=>{let n=$(t).data()||{};s.push(n.co);let r=$inv.itemToContract(n),a=(n.SetItmId||"").toString();""!==a&&a!==r.id&&(r.setId=a),l.push(r);let d=!1===["text","title"].includes((n.Type||"other").toLowerCase());n.position=((e,t)=>{if(!e)return"";let n=Math.max(t||0,0);for(;i.length<=n;)i.push(0);return i.length=n+1,i[n]++,i.join(".")})(d,(n.co||{}).lvl||0),$inv.rrw.call(t)})),t.push({Id:a.Id,nme:a.Name,text:a.text,itm:s,items:l})}));let r=e.find("tbody:not(.empty)").length;n.find("tr.isum").tC("hidden",r<2),e.data("bai",t),""===(e.data("dtoken")||"")&&!1===bool(e.data("dseeding"),!1)&&null!=(e.data("admin")||{}).type&&(e.data("dseeding",!0),$inv.d.seed($.extend($inv.invcPayload(e.data()),{invid:e.data("invid")||""})))},$inv.worknotes=function(e){let t="";return e.steps.forEach(((e,n)=>{let i;try{i=JSON.parse(e.Data||{}).fields||[]}catch(e){console.debug(e),i=[]}!0!==Array.isArray(i||"")&&(i="object"==typeof i&&!0===Array.isArray(i.field||"")?i.field:[]),i.forEach(((e,n)=>{"Ausgeführte Arbeiten"===e.name&&(t=e.result||"")}))})),t},$inv.rendersrq=function(){let e=$(this).empty(),t=e.is(".onesum"),n=e.data(),i=$$.tr(e,{id:"srq"+n.Id}).aC("title nosort"),r=($rcol.itm.lbl(),$$.dc("axf").appendTo($$.tdc("aux",i)));$$.dc("ibtn osum",r,{title:$rct.combP}).append(gi("euro")).click((function(t){e.tC("onesum"),$inv.rendersrq.call(e),$inv.t_fds_inv()})),$$.dc("ibtn setvat",r,{title:$rct.sV}).append(gi("gbp")).click(i,$inv.setVat),$$.dc("ibtn insb",r,{title:$rct.iRb}).append(gi("indent-left")).click(i,$inv.inRow);let a,s=$$.sc("text",n.text),l=($$.td(i,{colspan:t?4:5}).append(s),["net_val","vat_val","svcnet_val","svcvat_val","net"]);if($$.dc("ibtn edit",r,{title:$rct.sectionTitleEditTT}).data("dialog",$rcol.req.lbl().Name).append(gi("pencil")).click({t:s,change:e=>{n.text=e,$inv.t_fds_inv()}},$inv.eHtml),t&&($$.tdc("currency isumval",i),a={Id:n.Id.toString()+"_osum",net_val:0,vat_val:0,svcnet_val:0,svcvat_val:0,net:0},a.tbl=$$.tblset({class:"stbl"})),$.each(n.items||[],((n,i)=>{let r,s={Id:i.Id,net_val:i.net_val||0,vat_val:i.vat_val||0,svcnet_val:0,svcvat_val:0,net:i.net||0,Note:i.Note||""};if("service"===i.Type.toLowerCase())s.svcnet_val=i.net_val||0,s.svcvat_val=i.vat_val||0;t?(r=$$.tr(a.tbl.bdy,{id:"itm"+i.Id,class:"sitm"}).aC(i.Type),"Text"===i.Type||"Title"===i.Type?$$.td(r,{colspan:2}).html(i.htmltext||i.Note):($$.tdc("keep",r).text(i.quantity||((i.quantityhours||0)>0?fnum(i.quantityhours)+(i.UnitString||"").eine(" ",""):"")),i.htmltext?$$.tdc("txt",r).html(i.htmltext):$$.tdc("txt",r).text(i.NameOrNumber).attr("title",i.Note)),$.each(l,((e,t)=>{a[t]+=s[t]})),r.data(s)):($.extend(s,i),r=$$.tr(e,{id:"itm"+i.Id,class:"itm"}),r.data(s),$inv.rrw.call(r))})),t){let t=$$.tr(e,{id:"itmsq"+n.Id,class:"itm osum"}).data(a);$inv.rrw.call(t)}else{let t=$$.tr(e).aC("isum nosort");$$.tdc("aux",t),$$.td(t,{colspan:4}).text($rct.iSum),$$.tdc("currency isumval",t)}},$inv.t_fds_inv=()=>{let e=$("div.invoice_layout table.invi");if(e.trigger("fds.inv"),""!==(e.data("dtoken")||""))return $inv.d.syncChanged(e);let t=e.data("dseedpromise");return t?$.when(t).then((()=>$inv.d.syncChanged(e))):$.when()},$inv.sedit=()=>{$inv.sprev(!0)},$inv.jdisp=function(e){e.stopPropagation(),e.data.id&&$inv.disp(e.data.id,e.data.typ||"")},$inv.disp=(e,t)=>{let n="";switch(t){case"inv":n="inv/rdoc";break;case"rem":n="rem/rdoc"}if(""!==n){let t=$inv.pdfWaitDlg();$ocms.postXT({url:$ocms.url(n),data:{id:e||"",typ:"img"},timeout:$inv.pdfPreviewTimeout,success:e=>{let t=$$.dc("imagecollection pdfpreview"),n=Math.round(.88*vh());e.id;$.each(e.img||[],(function(e,i){$$.dc("pdfp",t).append($$.img(i).css("max-height",(n-rpx(6)).toString()+"px"))})),$ocms.dlg(t,{size:[n,Math.round(.88*vw())],zindex_min:50,form:!1,exclusive:!1})},error:$inv.pdfPreviewFailed,complete:$inv.pdfPreviewComplete(null,t)})}},$inv.jdbn=function(e){let t=$inv.pdfWaitDlg();$ocms.postXT({url:$ocms.url("inv/rdocn"),data:{name:e.data.id||"",typ:"img"},timeout:$inv.pdfPreviewTimeout,success:e=>{let t=$$.dc("imagecollection pdfpreview"),n=Math.round(.88*vh());e.id;$.each(e.img||[],(function(e,i){$$.dc("pdfp",t).append($$.img(i).css("max-height",(n-rpx(6)).toString()+"px"))})),$ocms.dlg(t,{size:[n,Math.round(.88*vw())],zindex:50,form:!1})},error:$inv.pdfPreviewFailed,complete:$inv.pdfPreviewComplete(null,t)})},$inv.sp13b=()=>{var e=$("div.invoice_layout").find("table.invi"),t=e.data();t.admin.p13b=!0,!1===(t.inv.InvoiceOptions||"").split(",").includes("§13b")&&(t.inv.InvoiceOptions+=",§13b"),e.trigger("fds.inv"),$inv.d.sync({Target:"p13b",Value:t.admin.p13b})},$inv.itemToContract=function(e){let t=((e=e||{}).Type||"").toString().toLowerCase(),n=e=>e??null,i={id:(e.Id||"").toString(),type:t,title:"",desc:"",qty:"",price_net:"",total_net:n(e.net_val),vat:e.vat||""};var r;return e.co&&"osum"===e.co.typ?(i.desc=e.co.t||"",i.total_net=e.net_val||0):["text","title"].includes(t)&&0===(e.net_val||0)?(i.desc=e.htmltext||("#"!==(e.NameOrNumber||"").substr(0,1)?(r=$$[0]("p").text(e.NameOrNumber||""),$$.d().append(r).html()):"")+(e.Note||""),i.total_net=""):(e.htmltext?i.desc=e.htmltext:(i.title=e.NameOrNumber||"",i.desc=e.Note||""),i.qty=e.quantity||(0!==(e.quantityhours||0)?fnum(e.quantityhours)+(e.UnitString?" "+e.UnitString:""):""),i.price_net=n(e.net),i.total_net=n(e.net_val)),i},$inv.hasSets=e=>((e||{}).req||[]).some((e=>{let t=((e||{}).itm||[]).filter((e=>e&&""!==(e.id||""))),n={};t.forEach((e=>{n[(e.id||"").toString()]=e}));return t.some((e=>{let t=(null==e.SetItmId?"":e.SetItmId).toString();return""!==t&&t!==(e.id||"").toString()&&n[t]&&(e=>"set"===(e.typ||"").toString().toLowerCase())(n[t])}))})),$inv.ssetmode=()=>{let e,t=$("div.invoice_layout").find("table.invi").data();if(t.dstate&&!1===$inv.hasSets(t.dstate))return void alert($rct.toSetMn);let n=t=>$$.dc("btn",$ict.setmo[t]).click((()=>{e.c.trigger("modal_close"),$inv.setSetmode(t)})),i=$$.dc("choicefrm").append([n("setprice"),n("setonly")]);e=$ocms.dlg(i,{width:800})},$inv.setSetmode=e=>{if(!1===confirm($rct.toSetMc||$rct.toSetPc))return;let t="setonly"===e?"block.setonly":"block.setprice";$.when($inv.t_fds_inv()).done((()=>{$inv.d.sync({Target:t})}))},$inv.sctp=()=>{let e=$invcol.ctp;$ocms.dlgform(e,{title:$ict.ctp,success:function(e){var t=$("div.invoice_layout"),n=t.find("table.invi").data();let i={};void 0!==n.new&&"{"===(n.new.CustomValues||"").substr(0,1)&&(i=JSON.parse(n.inv.CustomValues)),i.contactName=e.name,i.contactEmail=e.email,n.new.CustomValues=JSON.stringify(i),t.find(".ctpfrm").text(ne(e.name,e.email)),$inv.d.sync({Target:"contact",Value:{name:e.name,email:e.email}})},typedvalues:!0})},$inv.invcPayload=function(e){e=e||{};let t=$.extend({},e.new),n=$.extend({},e.admin);return t.title=null!=t.invoicetitle?t.invoicetitle:t.title||"",t.provisionlocation=null!=t.loc?t.loc:t.provisionlocation||"",t.paymentterm=null!=n.paymentterms?n.paymentterms:t.paymentterm||"",n.customerid=null!=n.customerid?n.customerid:n.CustomerId,{admin:n,req:e.bai,new:t}},$inv.ssave=()=>{$inv.d.save()},$inv.sprev=e=>{$inv.d.preview()},$inv.rReload=()=>{try{let e=$("#listframe ul.rql:first").data();$inv.cInv2({id:e.search})}catch(e){}},$inv.quantChange=function(e){},$inv.storno=function(e,t){let n,i=$$.dc("choicefrm").append([$$.dc("btn","Storno ohne Details").click({id:e,mode:"simple"},(e=>{n.c.trigger("modal_close"),$inv.cSt(e.data)})),$$.dc("btn","Storno mit neuer Rechnung").click({id:e},(e=>{n.c.trigger("modal_close"),$inv.ccStInv(e)})),$$.dc("btn","Storno mit best. Rechnung").tC("inactive",!1===bool(t,!1)).click({id:e,mode:"copy"},(e=>{!0===bool(t,!1)&&(n.c.trigger("modal_close"),$inv.cSt(e.data))}))]);n=$ocms.dlg(i,{width:1e3})},$inv.credit=function(e,t){let n,i=$$.dc("choicefrm").append([$$.dc("btn","Gutschrift").click({id:e,mode:"credit"},(e=>{n.c.trigger("modal_close"),$inv.cSt(e.data)}))]);n=$ocms.dlg(i,{width:1e3})},$inv.setPyd=function(e){confirm($ict.cpyd)&&$ocms.postXT({url:$ocms.url("inv/setpyd"),timeout:60,data:{id:e},success:e=>{alert($ict.relm)},error:()=>{alert($t.f1)}})},$inv.setUpd=function(e){confirm($ict.cupd)&&$ocms.postXT({url:$ocms.url("inv/setupd"),timeout:60,data:{id:e},success:e=>{alert($ict.relm)},error:()=>{alert($t.f1)}})},$inv.resendRem=function(e){e.stopPropagation(),e.data.id&&confirm(string($ict.remresc,[e.data.name]))&&$ocms.postXT({url:$ocms.url("rem/resend"),timeout:60,data:{id:e.data.id},success:t=>{alert(string($ict.remresr,[e.data.name]))},error:()=>{alert($t.f1)}})},$inv.dspRem=function(e){let t=$$.dc("rfrm").ldng(1),n=$ocms.dlg(t,{width:1e3});n.ft.rwText($rct.rq2),$ocms.postXT({url:$ocms.url("inv/getrem"),timeout:60,data:{id:e,drafts:!1},success:e=>{n.ft.empty();let i=$$.tblset({class:"invtbl"},t.empty()),r=$invcol.rem2,a=$$.tr(i.hd);$$.th(a);$.each(r.fields||[],((e,t)=>{$$.th(a).text(t.label)}));let s=!1;$.each(e,((e,t)=>{s=!s;let n=$$.tr(i.bdy).tC("alt",s),a=$$.td(n);n.click((function(){n.tC("selected").siblings().rC("selected")})),!0===bool(t.hasFile,!1)&&($$.dc("idl ilbtn",a,{title:$ict.dl+"\n"+t.DocumentName}).append(gi("save-file","ico")).click({id:t.Id},$inv.downloadrem),$$.dc("idl ilbtn",a,{title:$ict.remdsp+"\n"+t.DocumentName}).append(gi("eye-open","ico")).click({id:t.Id,typ:"rem"},$inv.jdisp),$$.dc("idl ilbtn",a,{title:$ict.remres+"\n"+t.DocumentName}).append(gi("refresh","ico")).click({id:t.Id,typ:"rem",name:t.DocumentName},$inv.resendRem)),$.each(r.fields||[],((e,i)=>{let r=$$.td(n).aC(i.dtype),a=t[i.name];if("function"==typeof i.dfnc)i.dfnc.call(r,a,t);else switch(i.type||""){case"date":r.text(fdt(t[i.name],"dd.MM.yy"));break;case"datetime":r.text(fdt(t[i.name]));break;case"html":r.append($$.dc("ctw").html(a)),r.append($$.dc("ttip").html(a));break;default:r.text(t[i.name])}if("InvoiceId"===(i.name||""))r.aC("keep");switch(typeof i.title){case"function":i.title.call(r,t);break;case"string":r.attr("title",cs.title)}}))}))},error:()=>{t.empty(),n.ft.rwText($t.f1)},complete:()=>{t.ldng(0)}})},$inv.ccRem=function(e,t){$(this);$ocms.postXT({url:$ocms.url("rem/lrem"),timeout:60,data:{id:e},success:n=>{let i=$invcol.rid.clone();i.applyValues(n.ov);let r=$$.dc("ac"),a=$$.tblset({class:"fullgrid fullwidth"},r);if((n.lst||[]).length>0){$$.d({style:"margin: 1.5rem 0 1rem 0;font-size: 110%;text-decoration: underline;"}).prependTo(r).text($ict.rovlh);let e=$$.tr(a.hd);$ict.rovl.forEach(((t,n)=>$$.th(e,t))),$.each(n.lst,((e,t)=>{$$.tr(a.bdy).append([$$.tdc("keep",t.subject),$$.tdc("currency",fnum(t.amount,$rct.cst)),$$.tdc("currency",fnum(t.amount_payed,$rct.cst)),$$.tdc("keep",fdt(t.DateFinalized,"dd.MM.yy"))])}))}else $$.td($$.tr(a.bdy),$ict.nd);$ocms.dlgform(i,{addcontent:r,title:string($ict.remdt,[t||"?"]),success:function(t){$inv.ccRem_s2(e,t)},typedvalues:!0})}})},$inv.rRemRw=function(e){let t=$(this),n=e.rm||{};t.empty().data({invoiceid:n.invoiceid,invoicedate:n.invoicedate,amount:n.amount,amount_payed:n.amount_payed});let i=[{lbl:$rct.cP,attr:{title:$rct.cP},data:t,fnc:$inv.eRowR}],r=$$.dc("axf").append($inv.rowCtxMenu(i));t.append([$$.tdc("aux").append(r),$$.tdc("keep",n.invoiceid),$$.tdc("keep",fdt(n.invoicedate,"dd.MM.yy")),$$.tdc("currency",fnum(n.amount,$rct.cst)),$$.tdc("currency",fnum(n.amount_payed,$rct.cst)),$$.tdc("currency",fnum(n.amount-n.amount_payed,$rct.cst))])},$inv.eRowR=function(e){let t=$(this),n=e.data,i=n.data()||{},r=$invcol.rem.clone().applyValues(i);$ocms.dlgform(r,{title:t.data("dialog")||"",success:function(e){let i=t.closest("table"),r=i.data();$.extend(r.rm,e),i.data(r),$inv.rRemRw.call(n,r),$inv.rd.syncAmount(r.rm.amount,r.rm.amount_payed)},typedvalues:!0})},$inv.ccRem_s2=function(e,t){$fis.lf(!1).rC("fix").aC("hd");let n=$$.dc("invoice_layout",$fis.frm_edit()).append($$.dc("btn sprev").click($inv.rprev));$inv.eM(!1,!0);$$.dc("rfrm").ldng(1);$ocms.postXT({url:$ocms.url("rem/get"),timeout:60,data:$.extend({id:e},t),success:e=>{let t=e.rm||{},i=$$.dc("srq",n),r=$$.tblset({class:"invi"},i);r.ft=$$[0]("tfoot"),r.tbl.data($.extend({invid:t.invid,new:{}},e));let a=$$.tr(r.hd).aC("shd").append([$$.th().aC("aux")]);$ict.remHR.forEach((e=>$$.th(a,e))),$inv.rRemRw.call($$.tr(r.bdy),r.tbl.data()),r.ft.appendTo(r.tbl);let s={invoiceemail:"Email-Adresse ändern",subject:"Betreff ändern"},l=(e,t,i,a,l)=>{let d=$$.dc("inpfrm",n).aC(e).append("string"==typeof a?$$.dc("ahd",a):a>0?$$.dc("ahd",$rct.frm[i]):null),c=$$.dc("content",d).rwText(t);$$.dc("axf",d).append($$.dc("ibtn edit",{title:s[i]||$rct.frmTT[i]||$rct.frm[i]}).data("dialog",$rct.frm[i]).append(gi("pencil")).click($.extend({t:c,nme:i,change:e=>{r.tbl.data("new")[i]=e}},l),$inv.eHtml)),r.tbl.data("new")[i]=t};l("tfrm",t.subject,"subject",0,null),l("adrfrm",t.invoiceaddress,"invoiceaddress",0,null),l("emailfrm",t.invoiceemail,"invoiceemail",0,null),$$.dc("sndfrm",n).append($$.dc("content").text(t.sender)),r.tbl.children("tbody").each($inv.bdysort),r.tbl.trigger("fds.inv");let d=r.tbl.data("new");d.amount=t.amount,d.amount_payed=t.amount_payed,$inv.rd.seed({rem:{invid:t.invid,type:t.type,invoiceid:t.invoiceid,invoicedate:t.invoicedate},new:d})},complete:()=>{}})},$inv.rprev=()=>{$inv.rd.preview()},$inv.sis=e=>{confirm($ict.sisc)&&$ocms.postXT({url:$ocms.url("inv/sis"),data:{id:e||""},success:e=>{}})},$inv.srs=e=>{confirm($ict.srsc)&&$ocms.postXT({url:$ocms.url("rem/srs"),data:{id:e||""},success:e=>{}})},$inv.mfrrel=e=>{$("#contentframe").ldng(),$ocms.postXT({url:$ocms.url("inv/mfrrel"),data:{id:e||""},success:e=>{$inv.rerenderinv()},complete:()=>{$("#contentframe").ldng(0)}})},$inv.sets={o:null,c:null,drag:null,isOpen:()=>!!$inv.sets.o,open:function(){let e=$inv.d.tbl();if(e.length<1||$inv.sets.isOpen())return;if(""===$inv.d.token()&&!e.data("dstate"))return;let t=$$.dc("setstruct");$inv.sets.c=t,$inv.sets.o=$ocms.dlg(t,{title:$ict.setst,size:[-1,960],exclusive:!1,close:()=>{$inv.sets.o=null,$inv.sets.c=null,$inv.sets.drag=null}});let n=e.data("dstate");n?$inv.sets.render(n):$inv.d.refresh()},title:e=>{let t=$$.d().html(e.t||"").text().replace(/\s+/g," ").trim();return""!==t?t:$ict.setsNoTitle||""},typLbl:e=>{let t=(e.typ||"").toString().toLowerCase();return($ict.settyp||{})[t]||e.typ||""},isSet:e=>"set"===(e.typ||"").toString().toLowerCase(),parentOf:(e,t)=>{let n=(null==e.SetItmId?"":e.SetItmId).toString(),i=(e.id||"").toString();if(""===n||n===i)return"";let r=t[n];return r&&$inv.sets.isSet(r)?n:""},isDescendant:(e,t,n)=>{let i={},r=n[e];for(;r;){let e=$inv.sets.parentOf(r,n);if(""===e||i[e])return!1;if(e===t)return!0;i[e]=!0,r=n[e]}return!1},canDrop:(e,t,n,i)=>!!e&&e.bid===n&&e.id!==t&&!$inv.sets.isDescendant(t,e.id,i),sync:e=>($inv.sets.c&&$inv.sets.c.aC("busy"),$inv.d.sync(e)),render:function(e){let t=$inv.sets.c;if(!t)return;let n=t.closest(".modal-body"),i=n.length?n.scrollTop():0;t.empty().rC("busy"),$$.dc("shint",t).text($ict.setsHint||""),(e.req||[]).forEach((e=>{if(!e)return;let n=(e.Id||"").toString();if(""===n)return;let i=(e.itm||[]).filter((e=>e&&""!==(e.id||""))),r={};i.forEach((e=>{r[(e.id||"").toString()]=e}));let a=$$.dc("sblock",t).data({bid:n});$inv.sets.rootZone($$.dc("sbhd",a).append($$.sc("nme",e.text||e.nme||n)),n,r);let s=$$.tblset({class:"stbl"},a),l=$$.tr(s.hd);($ict.setsHR||[]).forEach((e=>$$.th(l,e))),i.forEach((e=>$inv.sets.row(s.bdy,e,n,i,r))),$inv.sets.rootZone($$.dc("sroot",a).text($ict.setsRoot||""),n,r),$inv.sets.createBar(a,n,i,r)})),n.length&&n.scrollTop(i)},collapsed:{},hiddenByCollapse:function(e,t){let n={},i=e;for(;i;){let e=$inv.sets.parentOf(i,t);if(""===e||n[e])return!1;if($inv.sets.collapsed[e])return!0;n[e]=!0,i=t[e]}return!1},zone:function(e,t,n){let i=e.originalEvent||e,r=t[0].getBoundingClientRect(),a=(i.clientY||0)-r.top,s=r.height||1;return a<.3*s?"before":a>.7*s||!n?"after":"into"},clearDrop:()=>{$(".setstruct .dropok, .setstruct .dropbefore, .setstruct .dropafter").rC("dropok dropbefore dropafter")},row:function(e,t,n,i,r){let a=(t.id||"").toString(),s=parseInt(t.lvl||0,10)||0,l=$inv.sets.isSet(t),d=$inv.sets.parentOf(t,r),c=l&&!!$inv.sets.collapsed[a],o=$$.tr(e,{draggable:"true"}).aC("srow lvl"+s).tC("isset",l).tC("folded",c).data({id:a,bid:n});$inv.sets.hiddenByCollapse(t,r)&&o.aC("hid"),$$.tdc("grip",o).append(gi("move")).attr("title",$rct.mR),$$.tdc("pos",o).text(null!=t.p?t.p:"");let u=$$.tdc("typ",o);l&&u.append($$.sc("fold").attr("title",c?$ict.setsExpand:$ict.setsCollapse).append(gi(c?"triangle-right":"triangle-bottom")).click((e=>{e.stopPropagation(),c?delete $inv.sets.collapsed[a]:$inv.sets.collapsed[a]=!0;let t=$inv.d.tbl().data("dstate");t&&$inv.sets.render(t)}))),u.append($$.s($inv.sets.typLbl(t))),$$.tdc("qty",o).text(t.q||"");let m=$$.tdc("ttl",o);if(""!==d&&m.append($$.sc("seti",$inv.sets.title(r[d]))),m.append($$.sc("txt",$inv.sets.title(t)).click((function(e){e.stopPropagation(),$(this).tC("exp")}))),l){let e=i.filter((e=>$inv.sets.parentOf(e,r)===a)).length;m.append($$.sc("cnt"," ("+e+")"))}let v=i.filter((e=>$inv.sets.parentOf(e,r)===d)),p=v.findIndex((e=>(e.id||"").toString()===a)),f=v.slice(0,p).some((e=>$inv.sets.isSet(e))),h=$$.tdc("act",o),g=(e,t,n,i,r)=>$$.dc("ibtn "+e,h,{title:n}).append(gi(t)).tC("disabled",!i).click((()=>{i&&$inv.sets.sync(r)}));g("up","arrow-up",$ict.setsUp,p>0,{Target:"set.move",Ref:a,Value:-1}),g("down","arrow-down",$ict.setsDown,p>=0&&p0,{Target:"set.level",Ref:a,Value:-1}),g("in","chevron-right",$ict.setsIn,f,{Target:"set.level",Ref:a,Value:1}),o.on("dragstart",(e=>{$inv.sets.drag={id:a,bid:n},o.aC("dragging");try{e.originalEvent.dataTransfer.setData("text/plain",a),e.originalEvent.dataTransfer.effectAllowed="move"}catch(e){}})).on("dragend",(()=>{o.rC("dragging"),$inv.sets.drag=null,$inv.sets.clearDrop()}));return o.on("dragover",(e=>{if(!$inv.sets.canDrop($inv.sets.drag,a,n,r))return;e.preventDefault();let t=$inv.sets.zone(e,o,l);o.rC("dropok dropbefore dropafter").aC("into"===t?"dropok":"before"===t?"dropbefore":"dropafter")})).on("dragleave",(()=>{o.rC("dropok dropbefore dropafter")})).on("drop",(e=>{e.preventDefault(),$inv.sets.clearDrop();let t=$inv.sets.drag;if($inv.sets.drag=null,!$inv.sets.canDrop(t,a,n,r))return;let i=$inv.sets.zone(e,o,l);"into"===i?$inv.sets.sync({Target:"set.assign",Ref:t.id,Value:{parent:a}}):$inv.sets.sync({Target:"set.move",Ref:t.id,Value:{anchor:a,where:i}})})),o},rootZone:function(e,t,n){return e.on("dragover",(i=>{(()=>{let e=$inv.sets.drag;return!!e&&e.bid===t&&!!n[e.id]&&""!==$inv.sets.parentOf(n[e.id],n)})()&&(i.preventDefault(),e.aC("dropok"))})).on("dragleave",(()=>{e.rC("dropok")})).on("drop",(i=>{i.preventDefault(),e.rC("dropok");let r=$inv.sets.drag;$inv.sets.drag=null,r&&r.bid===t&&n[r.id]&&""!==$inv.sets.parentOf(n[r.id],n)&&$inv.sets.sync({Target:"set.assign",Ref:r.id,Value:{parent:""}})})),e},createBar:function(e,t,n,i){let r=$$.dc("screate",e),a=$("").attr({name:"typ"}).append([$$.opt("set",$ict.settyp.set),$$.opt("text",$ict.settyp.text)]),s=$("").attr({name:"parent"}).append($$.opt("",$ict.setsTop));n.forEach((e=>{if(!$inv.sets.isSet(e))return;let t=parseInt(e.lvl||0,10)||0;s.append($$.opt((e.id||"").toString()," ".repeat(3*t)+$inv.sets.title(e)))}));let l=$('').attr({name:"title",placeholder:$ict.setsTitle,maxlength:250}),d=()=>{let e=(l.val()||"").toString().trim();""!==e?($inv.sets.sync({Target:"set.create",Ref:t,Value:{typ:a.val(),title:e,parent:s.val()||""}}),l.val("")):l.focus()};return l.on("keydown",(e=>{"Enter"===e.key&&(e.preventDefault(),d())})),r.append([$$.sc("lbl",$ict.setsNew),a,$$.sc("lbl",$ict.setsInto),s,l,$$.bbtn($ict.setsAdd,"sadd").click(d)]),r}}; \ No newline at end of file +let $rct={mdl:"Aufträge",or:"offene Aufträge",orr:"offene Aufträge (4 W)",rn:"Auftragsnummer",iov:{all:"Auftragsübersicht (alle)","":"Auftragsübersicht"},wk:"Woche",nd:"Keine Daten gefunden.",h:"Uhr",rq1:"Auftragsdaten werden von MFR abgerufen.\nDer Vorgang kann bis zu 90Sek dauern.",rq2:"Auftragsdaten werden geladen",rq1f:"Die Auftragsdaten von MFR konnten nicht oder nicht schnell genug abgerufen werde.\nMöchten Sie mit den bestehenden Daten trotzdem weitermachen?",note1:"Im Bruttobetrag sind {0} Lohnkosten enthalten (netto {1}). Die darin enthaltene Umsatzsteuer beträgt {2}.",note2:"Bitte beachten Sie, nach §14 Abs. 1 Umsatzsteuergesetz ist diese Rechnung ein Zahlungsbeleg oder eine andere beweiskräftige Unterlage für 2 Jahre nach Ablauf des Kalenderjahres der Ausstellung dieser Rechnung aufzubewahren, soweit nicht aufgrund anderer gesetzlicher Regelungen andere ggf.längere Aufbewahrungsfristen gelten.",note3:"Privathaushalten erstattet das Finanzamt bis zu {0} des Arbeitslohns mit der nächsten Steuererklärung.",note4:"Für bereits erbrachte Arbeiten, Dienstleistungen, Materiallieferungen und getätigte Bestellvorgänge zum oben genannten Bauvorhaben, die sich aus dem mit Ihnen geschlossenen Vertrag ergeben, stellen wir Ihnen vertragsgemäß unsere Akontozahlung in Rechnung. Eine Endabrechnung erhalten Sie als Schlussrechnung nach Abschluss des gesamten Bauvorhabens. Das Ausführungsdatum entnehmen Sie bitte dem Schlusstext dieser Rechnung. Wir danken Ihnen herzlich für das entgegengebrachte Vertrauen und bitten Sie um kurzfristigen Ausgleich der Akontorechnung.",note13b:"Gem. §13b Umsatzsteuergesetz unterliegen Sie der Steuerschuldnerschaft des Leistungsempfängers zur Umsatzsteuer aus dieser Rechnung mit einem Steuersatz von 19%.",crI:"Rechnung erstellen",crII:"Abschlagsrechnung erstellen",dII:"Für eine Abschlagsrechnung darf nur ein Auftrag gewählt werden.",dnS:"Für eine Rechnung muss mindestens ein Auftrag gewählt werden.",inv:"Rechnung",invs:"Rechnungen",req:"Auftrag",provP:"Leistungszeitraum",provD:"Leistungsdatum",cP:"Position ändern",iRb:"Zeile darunter einfügen",dR:"Zeile löschen",sV:"USt festlegen",cD:"Löschen?",mR:"Zeile verschieben",ctxM:"Weitere Aktionen",noteToggle:"Notiz ein-/ausblenden",sectionTitleEditTT:"Auftragsbezeichnung ändern",svcPart:"Service-Anteil",vat:"Umsatzsteuer",combP:"Positionen zusammenfassen",toSetP:"Auf Setpreis umstellen (Positionen ohne Preis)",toSetPc:"Der Set-Preis wird auf die Summe seiner Positionen gesetzt und die Positionen selbst verlieren ihren Preis. Das ist nicht rückgängig zu machen (der Betrag kann danach nur noch manuell geändert werden). Fortfahren?",toSetMc:"Jedes Set erhält die Summe seiner Positionen als Set-Preis; die Positionen des Sets werden ohne Preis dargestellt bzw. ausgeblendet. Positionen ausserhalb eines Sets bleiben unverändert einzeln aufgeführt. Das ist nicht rückgängig zu machen (die Set-Preise können danach nur noch manuell geändert werden). Fortfahren?",toSetMn:'Diese Rechnung enthält kein Set. Legen Sie zuerst über "Set-Struktur bearbeiten" ein Set an bzw. ordnen Sie Positionen einem Set zu.',iSum:"Zwischensumme",dtRel:"Freigegeben am: ",dtCr:"Erstellt am: ",rqV:"USt des Auftrags?",cthd:"wirklich aus-/einblenden ?",cst:{style:"currency",currency:"EUR"},sts:{IsWorkDone:"Arbeiten erledigt",Closed:"Auftrag geschlossen",SubcontractorPendingConfirmation:"Warten auf Bestätigung (Unterauftrag)",Scheduled:"Geplant",OfferIsRejected:"Angebot abgelehnt",OfferIsSend:"Offen (Angebot versandt)",CollaborationWaitingConfirmation:"Warten auf Bestätigung (Zusammenarbeit)",Released:"Freigegeben",OfferIsConfirmed:"Bestätigt",InProgress:"In Bearbeitung",ReadyForScheduling:"Zur Planung",Created:"Erstellt",Rejected:"Abgebrochen",Invoiced:"Rechnung gestellt","-":"-"},invHR:["Pos.","Menge","Artikelbezeichnung","VK","Summe"],frm:{invoicetitle:"Titel",invoiceaddress:"Adresse",loc:"Leistungsort / Lieferadresse",invoiceemail:"Email",invoiceemailcc:"Zusatzempfänger (CC)",provisionperiod:"Leistungsdatum / -zeitraum"},frmTT:{invoicetitle:"Rechnungstitel ändern",invoiceaddress:"Rechnungsempfänger-Adresse ändern",loc:"Leistungsort oder Lieferadresse ändern",invoiceemail:"Email-Adresse ändern und zusätzliche Email-Empfänger festlegen",provisionperiod:"Leistungsdatum oder -zeitraum ändern"}},$rcol={req:new fields_definition("Auftrag","Aufträge",[{name:"tags",label:"",type:"string",dfnc:function(e,t){""!==(e||"")&&($(this).aC("tags"),e.split(",").forEach((e=>{""!==e&&$(this).append($$.sc("tag "+e.replace(" ","_").replace("/","_").toLowerCase(),e))})))}},{name:"DateOfCreation",label:"Datum",type:"date",title:function(e){$(this).attr("title",$rct.dtCr+fdt(e.DateOfCreation).ne("-")+" \n"+$rct.dtRel+fdt(e.DateReleased).ne("-"))}},{name:"CustomerName",label:"Kunde (Firma)",type:"string"},{name:"Name",label:"Auftragsname",type:"string"},{name:"ExternalId",label:"Auftragsnummer",type:"string"},{name:"ParentExtenalId",label:"PAuftrag",type:"string"},{name:"InvoiceId",label:"RNummer",type:"string",dfnc:function(e,t){$(this).rwText(e," ").find("span").each((function(){$(this).aC("cla").click({id:$(this).text()},$inv.jdbn)}))}},{name:"State",label:"Status",type:"string"},{name:"WorkDoneAt",label:"Erledigt am",type:"date"},{name:"Description",label:"Beschreibung",type:"html"}]),itm:new fields_definition("Auftragsposition","Auftragspositionen",[{name:"NameOrNumber",label:"Bezeichnung",type:"string"},{name:"Type",label:"Typ",type:"select",required:!0,value:"Text",url:[{value:"Text",label:"Text"},{value:"Equipment",label:"Ausrüstung"},{value:"Material",label:"Material"},{value:"Service",label:"Arbeitsleistung"}],change:function(e){$req.quantChange.call(this,e)}},{name:"quantityhours",label:"Anzahl / Menge",type:"number",precision:"0.01",value:1,change:function(e){$inv.quantChange.call(this,e)}},{name:"UnitString",label:"Einheit",type:"select",url:["LFDM","Stck","Std.","QM","AW","Pauschal"],change:function(e){$inv.quantChange.call(this,e)}},{name:"net",label:"EinzelPreis netto",type:"number",precision:"0.01",value:0,change:function(e){$inv.quantChange.call(this,e)}},{name:"net_val",label:"GesamtPreis netto",type:"number",precision:"0.01",value:0},{name:"vat_val",label:"GesamtPreis USt",type:"number",precision:"0.01",value:0},{name:"svcnet_val",label:"Arbeitslohn netto",type:"number",precision:"0.01",value:0},{name:"svcvat_val",label:"Arbeitslohn USt",type:"number",precision:"0.01",value:0},{name:"net_pos",label:"Netto",type:"string"},{name:"bo_pos",label:"Brutto",type:"string"},{name:"vat",label:"USt",type:"string",value:"19,0%",change:function(e){$inv.quantChange.call(this,e)}},{name:"Note",label:"Details",type:"html",tinymce:!0}])},$ict={mdl:"Rechnungen",iov:{all:"Rechnungen (alle)","":"Rechnungen (nur fertige)","#d":"Rechnungen (nur Entwürfe)","#u":"Rechnungen (nur unbezahlt)","#r":"Rechnungen (nur angemahnt)","#a":"Rechnungen (nur Akonto)","#c":"Rechnungen (nur Storno)","#ru":"Rechnungen (nur angemahnt + unbez.)"},uba:", gesamter Zeitraum)",req:"Auftrag",inv:"Rechnung",rem:"Mahnung",in:"Rechnungsnummer",cc:"Kunde",wk:"Woche",nd:"Keine Daten gefunden.",dl:"Herunterladen",ed:"Bearbeiten",ced:"Bearbeitung fortsetzen",sItm:"Einzelheiten anzeigen",sPay:"Zahlungen anzeigen",cdI:"Entwurf der Rechnung löschen?",rel:"Neu Laden",relm:"Bitte laden Sie Liste manuell neu, um die Änderungen zu sehen.",dsp:"Rechnung anzeigen",storno:"Storno-Rechnung erstellen",credit:"Gutschrift erstellen",remd:"Mahnung erstellen",remdt:"Mahnung erstellen zur Rechnung {0}",remlst:"Mahnungen anzeigen",remdsp:"Mahnung anzeigen",remres:"Mahnung erneut senden",remresc:"Mahnung {0} wirklich erneut senden?",remresr:"Mahnung {0} wurde erfolgreich versandt.",setpyd:"Bezahlt markieren",cpyd:"Rechnung wirklich als bezahlt markieren?",setupd:"Bezahlt-Markierung aufheben",cupd:"Bezahlt-Markierung wirklich aufheben?",ivE:"Die Email-Adresse ist vermutlich nicht gültig.",ivEc:"\nMöchten Sie fortfahren?",pna:"Diese Seite ist in der Vorschau nicht verfügbar",bdLbl:"Rechnungsdatum auf den letzten Werktag des Vormonats setzen ({0})",bdTT:"Nur möglich, solange im neuen Monat noch keine Rechnung erstellt wurde. Rechnungsnummer und Fälligkeit richten sich nach diesem Datum.",tpe:"Die Anzahl von {0} Seiten wird aktuell nicht unterstützt",eis:"Der Rechnungsentwurf konnte nicht gespeichert werden.",pvw:"Das Dokument wird abgerufen und für die Vorschau aufbereitet.\nDer Vorgang kann bis zu 2 Minuten dauern.",pvf:"Die PDF-Vorschau konnte nicht erstellt werden.",pvto:"Der Server hat nicht rechtzeitig geantwortet (Zeitüberschreitung). Bitte versuchen Sie es erneut.",pvgone:"Der Entwurf ist auf dem Server nicht mehr vorhanden (Sitzung abgelaufen). Bitte öffnen Sie den Entwurf erneut.",iss:"Zwischenstand speichern.",p13b:"USt -> §13b",setm:"Set-Preisanzeige",setmo:{setprice:"Set mit Preis – Positionen ohne Preis",setonly:"Nur Set mit Preis – Positionen ausgeblendet"},setst:"Set-Struktur bearbeiten",setsHint:'Reihenfolge: Zeile per Drag & Drop an den oberen/unteren Rand einer anderen Zeile ziehen (davor/danach) oder ▲▼ nutzen. Zuordnung: Zeile auf die Mitte eines Sets ziehen (hinein) bzw. auf die Auftragszeile oder "oberste Ebene" (aus dem Set lösen); ◀▶ ändert die Ebene. Sets lassen sich über das Dreieck zu-/aufklappen und auch zugeklappt verschieben – ihre Positionen wandern mit. Änderungen werden sofort übernommen.',setsUp:"Nach oben (innerhalb der Ebene)",setsDown:"Nach unten (innerhalb der Ebene)",setsCollapse:"Set zuklappen",setsExpand:"Set aufklappen",setsHR:["","Pos.","Typ","Menge","Bezeichnung","Reihenfolge / Ebene"],setsRoot:"Hierher ziehen = aus dem Set lösen (oberste Ebene)",setsOut:"Eine Ebene höher (aus dem Set lösen)",setsIn:"Eine Ebene tiefer (dem vorangehenden Set zuordnen)",setsNew:"Neu:",setsInto:"in",setsTop:"oberste Ebene",setsTitle:"Bezeichnung",setsAdd:"Hinzufügen",setsNoTitle:"(ohne Bezeichnung)",settyp:{set:"Set",text:"Text",title:"Text",material:"Material",service:"Arbeitsleistung",equipment:"Ausrüstung",other:"Position",osum:"Zusammenfassung",intinvoiceallocation:"Abschlag",intinvoiceallocationdiff:"Abschlag (offen)"},ctp:"Ansprechpartner festlegen",mfr:"Von MFR neu abrufen",rq1:"Auftragsdaten werden von MFR abgerufen.\nDer Vorgang kann bis zu 90Sek dauern.",rq2:"Auftragsdaten werden geladen",iq1:"Rechnungsdaten werden von MFR abgerufen.\nDer Vorgang kann bis zu 90Sek dauern.",iq2:"Rechnungsdaten werden geladen",sis:"Rechnung als versandt markieren",srs:"Mahnung als versandt markieren",sisc:"Rechnung wirklich als versandt markieren?",srsc:"Mahnung wirklich als versandt markieren?",iSt:{dft:"Entwurf",uns:"nicht versandt",pyd:"bezahlt",cc:"storniert",op:"offen",due:"fällig",ovd:"überfällig",rem:"angemahnt"},rSt:["","Überfällig","2. Mahnung","3. Stufe"],pSt:{a:"Vollst.",p:"Teilz."},ivT:{i:"AbschlagsR.",f:"SchlussR",r:"Rechnung",c:"StornoR."},rovlh:"Übersicht der bisherigen Mahnungen",rovl:["Betreff","Betrag","Betrag gezahlt","fertiggestellt am"],remHR:["Rechnung","vom","Rechnungsbetrag","bereits bezahlt","noch offen"],translatePaymentTerm:e=>(e||"").replace("wd"," Werktagen").replace("d"," Tagen").replace("wk"," Wochen")||"10 Tagen",payi:{account:"Konto",name:"Zahler",text:"Verw.Zweck",InvoiceID:"Rechnung",amount:"Betrag",date:"Datum",manual:"Typ"}},$invcol={datev:new fields_definition("Rechnung","Rechnungen",[{name:"Umsatz (ohne Soll/Haben-Kz)",label:"Umsatz (ohne Soll/Haben-Kz)",type:"string"},{name:"vf",label:"vf",type:"string"},{name:"Soll/Haben-Kennzeichen",label:"Soll/Haben-Kennzeichen",type:"string"},{name:"Konto",label:"Konto",type:"string"},{name:"Gegenkonto",label:"Gegenkonto",type:"string"},{name:"BU-Schlüssel",label:"BU-Schlüssel",type:"string"},{name:"Belegdatum",label:"Belegdatum",type:"string"},{name:"Belegfeld 1",label:"Belegfeld 1",type:"string"},{name:"Belegfeld 2",label:"Belegfeld 2",type:"string"},{name:"Buchungstext",label:"Buchungstext",type:"string"}]),inv:new fields_definition("Rechnung","Rechnungen",[{name:"invstatus",label:"Status",type:"select",url:$ict.iSt},{name:"balance",label:"Umsatz",type:"string",dtype:"currency"},{name:"CustomerName",label:"Kunde",type:"string"},{name:"InvoiceId",label:"RNummer",type:"string"},{name:"InvoiceType",label:"Typ",type:"select",url:$ict.ivT},{name:"request",label:"Auftrag",type:"string",dtype:"num"},{name:"vat",label:"MwSt",type:"string",dtype:"num"},{name:"deb_cred",label:"Soll/Haben",type:"string"},{name:"customer",label:"Konto",type:"string",dtype:"num"},{name:"contra_account",label:"Gegenkonto",type:"string",dtype:"num"},{name:"Belegdatum",label:"Belegdatum",type:"date"},{name:"reminderstatus",label:"MahnStatus",type:"select",url:$ict.rSt},{name:"reminder",label:"# Mahnungen",type:"integer"},{name:"Buchungstext",label:"Buchungstext",type:"string"},{name:"Payment",label:"Zahlung",type:"string"}]),rem:new fields_definition("Zahlungserinnerung","Zahlungserinnerung",[{name:"amount",label:"Rechnungsbetrag",type:"number",precision:"0.01",value:1},{name:"amount_payed",label:"bereits bezahlt",type:"number",precision:"0.01",value:1}]),rem2:new fields_definition("Zahlungserinnerung","Zahlungserinnerung",[{name:"DocumentName",label:"Name",type:"string"},{name:"subject",label:"Betreff",type:"string"},{name:"DateSent",label:"Versanddatum",type:"date"},{name:"status",label:"Status",type:"string"},{name:"amount_open",label:"offener Betrag",type:"number",precision:"0.01"},{name:"InvoiceId",label:"RNummer",type:"string"}]),rid:new fields_definition("Zahlungserinnerung","Zahlungserinnerung",[{name:"type",label:"Typ",type:"select",url:[["f","einfache Zahlungserinnerung"],["m","Mahnung"],["l","letzte Mahnung"]],required:!0},{name:"level",label:"Stufe",type:"select",url:[["1","Stufe 1"],["2","Stufe 2"],["3","Stufe 3"],["4","Stufe 4"],["5","Stufe 5"],["6","Stufe 6"]],required:!0}]),ctp:new fields_definition("Ansprechpartner","Ansprechpartner",[{name:"name",label:"Name",type:"string"},{name:"email",label:"Email",type:"string"}])},gi=(e,t)=>$$.sc("glyphicon glyphicon-"+e).aC(t),$inv={},$req={init2:function(e,t){e=e||"inv",t=t||{},$ocms.getScript([],(function(){$req.init3(e,t)}))},init3:async function(e,t){$fis.cf(!0);let n=$fis.lf(!0);$("#topbar").ocmsmenu([]),$("#activemodule").text($rct.mdl),await $fis.prepAuth("fds_req,fds_inv,fds_reminder");let i=[(async()=>{!0===$fis.isAuth("fds_req",1)&&($req.prepLst(""),n.aC("fix"))})(),new Promise(((e,t)=>{n.find("div.oreq2").aC("selected"),$req.renderreq(fdt(new Date,"yy-MM-dd"),"r"),e()}))];await Promise.all(i)},prepLst:function(e){let t=new Date,n=$fis.lf(!0).ldng(1),i=new Date("2021-01-01");$fis.frm_list().IN((function(){}));$$.dc("mth oreq",n).text($rct.or).click((function(e){let t=$(this);e.stopPropagation(),t.siblings().rC("selected"),!0===t.is(".selected")&&(t.tC("selected"),$req.renderreq(fdt(new Date,"yy-MM-dd"),"o")),t.aC("selected")})),$$.dc("mth oreq2",n).text($rct.orr).click((function(e){let t=$(this);e.stopPropagation(),t.siblings().rC("selected"),!0===t.is(".selected")&&(t.tC("selected"),$req.renderreq(fdt(new Date,"yy-MM-dd"),"r")),t.aC("selected")})),$$.i({placeholder:$rct.rn}).appendTo($$.dc("mth oreqn",n)).enterKey((function(e){let t=$(this),n=t.val()||"";e.stopPropagation(),t.parent().siblings().rC("selected"),n.length>3&&(t.parent().aC("selected"),$req.renderreq("n:"+n,"s"),t.val(""))}));n.append("
");let r=$$.dc("mthl",n),a=t.getFullYear(),s=t.getMonth()+1;for(let t=i.getFullYear();t<=a;t++){let n=$$.dc("yr").prependTo(r).text($rct.iov[e]+" - "+t.toString()).toggleClass("selected",t===a);n.click({yr:t},(function(e){e.stopPropagation(),n.siblings().rC("selected"),n.aC("selected")}));let l=$$.dc("mfrm",n);for(let n=0;n<(t!==a?12:s);n++){i=new Date(t,n,1);let r=$$.dc("mth").prependTo(l).text($rct.iov[e]+" - "+fdt(i,"MMM yyyy"));r.click({yr:t,mt:n},(function(e){if(e.stopPropagation(),r.siblings().rC("selected"),!0===r.is(".selected")){r.tC("selected");let t=fdt(new Date(e.data.yr,e.data.mt,1),"yy-MM-dd");$req.renderreq(t,"m")}r.aC("selected")}));let a=getMonday(i),s=new Date(i);s.setMonth(s.getMonth()+1),s.setDate(0),s=getMonday(s);let d=$$.dc("wfrm",r);for(;a<=s;){let e=$$.dc("wk",d).text(($rct.wk||"W")+" "+fdt(a,"dd.MM.yy"));e.click({rd:new Date(a)},(function(t){t.stopPropagation();let n=fdt(t.data.rd,"yy-MM-dd");$req.renderreq(n,"w"),r.siblings().rC("selected").find(".wk").rC("selected"),r.aC("selected").find(".wk").rC("selected"),e.aC("selected")}));let t=$$.dc("wkdl",e).append($$.sc("ico glyphicon glyphicon-compressed"));!0===$fis.isAuth("fds_inv",2)&&t.click({rd:new Date(a)},(function(e){e.stopPropagation();let t=fdt(e.data.rd,"yy-MM-dd");$req.downloadzip.call(t,"w")})),a.setDate(a.getDate()+7)}}}n.ldng(0)},renderreq:function(e,t){let n=$fis.frm_list().ldng(1),i=$$.dc("invfrm",n).aC("md"+t),r=$fis.lf();$ocms.postXT({url:$ocms.url("req/reql"),data:{mode:t,tgt:e},success:n=>{r.rC("fix").aC("hd"),$$.dc("ovhd",i).append($$.s(n.admin.title)).appendIf($$.sc("note",n.admin.note),""!==ne(n.admin.note,""));let a=$$.tblset({},i),s=$rcol.req,l=$$.tr(a.hd);$$.th(l);$.each(s.fields||[],((e,t)=>{$$.th(l).text(t.label),"vat"===t.name&&$$.th(l)}));let d=0,c=!1;$.each(n.requests||[],((n,l)=>{d>0&&d!==l.ParentServiceRequestId&&(c=!c);let o=$$.tr(a.bdy).tC("alt",c);d=l.ParentServiceRequestId,o.click((function(){r.rC("fix").aC("hd"),o.tC("selected").siblings().rC("selected").find("td.av").rC("av"),o.find("td.av").rC("av")})),o.tC("child",l.isChild);let u=$$.td(o,{class:"raux"});!0===bool(l.open,!1)&&$$.dc("ihd ilbtn",u).append(gi("eye-close","ico")).click({id:l.Id},$req.tHd),$$.dc("iitm ilbtn",u).append(gi("list","ico")).click({id:l.Id},$req.showitm),!0===$fis.isAuth("fds_inv",2)&&$$.dc("invc ilbtn",u).append(gi("edit","ico")).click({id:l.Id},$inv.cInv),$.each(s.fields||[],((n,r)=>{let a=$$.td(o).aC(r.dtype),s=l[r.name];if("function"==typeof r.dfnc)r.dfnc.call(a,s,l);else switch(r.type||""){case"date":a.text(fdt(l[r.name],"dd.MM.yy"));break;case"datetime":a.text(fdt(l[r.name]));break;case"html":a.append($$.dc("ctw").html(s)),a.append($$.dc("ttip").html(s));break;default:a.text(l[r.name])}switch(r.name||""){case"State":a.text($rct.sts[s||"-"]);break;case"Name":a.aC(r.name.toLowerCase());break;case"vat":$$.sel().appendTo($$.td(o,{class:"vsel"})).click((function(e){e.stopPropagation()})).append([$$.opt("19,0 %","19,0 %"),$$.opt("16,0 %","16,0 %"),$$.opt("0,0 %","0,0 %")]).val(l[r.name]).change().change({frm:i,tgt:e,mode:t,id:l.Id,td:a},$req.setvat),a.tC("hl","19"!==l[r.name].substr(0,2)).click((function(e){e.stopPropagation(),$(this).tC("av")}));break;case"balance":a.aC("sh_"+(l.SollHaben||"").toLowerCase());break;case"InvoiceId":a.aC("keep")}switch(typeof r.title){case"function":r.title.call(a,l);break;case"string":a.attr("title",cs.title)}}))}))},complete:()=>{n.ldng(0)}})},tHd:function(e){let t=$(this).closest("tr");e.stopPropagation(),!1!==t.is(".selected")&&confirm($rct.cthd)&&$ocms.postXT({url:$ocms.url("req/rthd"),data:{id:e.data.id},success:n=>{n.id===e.data.id&&!1===bool(n.visible,!0)?(!1===t.is(".tbhd")&&setTimeout((()=>{t.filter(".tbhd").remove()}),15e3),t.aC("tbhd")):n.id===e.data.id&&t.rC("tbhd")}})},showitm:function(e){let t=$(this).closest("tr");if(e.stopPropagation(),!1===t.is(".selected"))return;let n=$$.dc("rfrm").ldng(1);$ocms.postXT({url:$ocms.url("req/pget"),data:{id:e.data.id},success:t=>{$ocms.postXT({url:$ocms.url("req/get"),data:{id:e.data.id,mode:"ful"},success:e=>{if((e.requests||[]).length<1)n.text($rct.nd);else{let t=$$.dc("srq",n),i=$$.tblset({class:"if"},t);$.each(e.requests||[],(function(e,t){e>0&&$$.tr(i.bdy).aC("sep").append($$.td({colspan:6}));let n=$$.tr(i.bdy).aC("title"),r=$rcol.itm.lbl(),a=$inv.worknotes(t);$$.td(n,{colspan:6}).append([$$.s($rcol.req.label_sng),$$.sc("eid",t.ExternalId),$$.sc("nme",fdt(t.WorkDoneAt,"dd.MM.yy")+": "+a.ne(t.Name))]);$$.tr(i.bdy).aC("shd").append([$$.td(),$$.td(r.NameOrNumber),$$.td(r.Type),$$.td(r.net_pos),$$.td(r.bo_pos),$$.td(r.vat)]);$.each(t.items||[],((e,t)=>{t.ServiceRequestId;let n=$$.tr(i.bdy,{id:"itm"+t.Id}).aC(t.Type);$$.td(n).aC("ico"),$$.td(n).text(t.NameOrNumber),$$.td(n).text(t.Type),$$.td(n).aC("currency").text(t.net_pos),$$.td(n).aC("currency").text(t.bo_pos),$$.td(n).aC("num").text(t.vat)}))}))}},error:()=>{n.text($t.t12)},complete:()=>{n.ldng(0)}})},error:()=>{n.text($t.t12),n.ldng(0)}}),$ocms.dlg(n,{width:1e3})}},$$req={init2:$req.init2,auth:{}};export default $$req;$inv.cInv=function(e){let t=$(this).closest("tr");e.stopPropagation(),!1!==t.is(".selected")&&!1!==$fis.isAuth("fds_inv",2)&&$inv.cInv2({id:e.data.id})},$inv.rMn=e=>{let t=[{lbl:$ict.req,itm:[]}];return!0===bool(e,!1)&&!0===$fis.isAuth("fds_inv",2)&&Array.prototype.push.apply(t[0].itm,[{lbl:$rct.crI,fnc:$inv.ccInv,data:{typ:"r"}},{lbl:$rct.crII,fnc:$inv.ccInv,data:{typ:"i"}}]),t.push({lbl:$ict.rel,fnc:$inv.rReload}),$("#topbar").ocmsmenu(t)},$inv.iMnr=e=>{let t=booln(e.isFinal,!0),n=e.Id,i=booln(e.fds,!1),r=[{glyph:"glyphicon-menu-left",fnc:()=>{$fis.frm_edit().remove()}},{lbl:$ict.inv,itm:[]},{lbl:$ict.rem,itm:[]}];return!1===t&&!0===$fis.isAuth("fds_inv",2)?r[1].itm.push({lbl:$ict.ced,fnc:$inv.clCntInv}):!0===$fis.isAuth("fds_inv",1)&&r[1].itm.push({lbl:$ict.dsp,fnc:()=>$inv.disp(n,"inv")}),!0===i&&!0===t&&!0===$fis.isAuth("fds_inv",2)&&(r[1].itm.push({lbl:$ict.storno,fnc:()=>$inv.storno(n,i)}),r[1].itm.push({lbl:$ict.credit,fnc:()=>$inv.credit(n,i)})),!0===t&&!0===$fis.isAuth("fds_reminder",2)&&(r[2].itm.push({lbl:$ict.remd,fnc:()=>$inv.ccRem(n,e.InvoiceId)}),r[2].itm.push({lbl:$ict.remlst,fnc:()=>$inv.dspRem(n)})),!0===t&&!0===$fis.isAuth("fds_reminder",2)&&!1===booln(e.IsSent,!1)&&r[2].itm.push({lbl:$ict.srs,fnc:()=>$inv.srs(n)}),r.push({lbl:$ict.rel,fnc:$inv.rReload}),$("#topbar").ocmsmenu(r)},$inv.iMn=e=>{let t=booln(e.isFinal,!0),n=e.Id,i=booln(e.fds,!1),r=[{glyph:"glyphicon-menu-left",fnc:()=>{$fis.frm_edit().remove()}},{lbl:$ict.inv,itm:[]},{lbl:$ict.rem,itm:[]}];return!1===t&&!0===$fis.isAuth("fds_inv",2)?r[1].itm.push({lbl:$ict.ced,fnc:()=>{$inv.cntInv({id:n})}}):!0===$fis.isAuth("fds_inv",1)&&r[1].itm.push({lbl:$ict.dsp,fnc:()=>$inv.disp(n,"inv")}),!0===$fis.isAuth("fds_inv",2)&&(r[1].itm.push({lbl:$ict.storno,fnc:()=>$inv.storno(n,i)}),r[1].itm.push({lbl:$ict.credit,fnc:()=>$inv.credit(n,i)})),!0===t&&!1===booln(e.IsPayed,!1)?(!0===$fis.isAuth("fds_reminder",2)&&r[2].itm.push({lbl:$ict.remd,fnc:()=>$inv.ccRem(n,e.InvoiceId)}),!0===$fis.isAuth("fds_inv",2)&&r[1].itm.push({lbl:$ict.setpyd,fnc:()=>$inv.setPyd(n)})):!0===t&&!0===booln(e.IsPayed,!1)&&"m"===(e.PaymentStatus||"")&&!0===$fis.isAuth("fds_inv",2)&&r[1].itm.push({lbl:$ict.setupd,fnc:()=>$inv.setUpd(n)}),!0===$fis.isAuth("fds_reminder",2)&&r[2].itm.push({lbl:$ict.remlst,fnc:()=>$inv.dspRem(n)}),!0===t&&!0===$fis.isAuth("fds_inv",2)&&!1===booln(e.IsSent,!1)&&r[1].itm.push({lbl:$ict.sis,fnc:()=>$inv.sis(n)}),!1===i&&r[1].itm.push({lbl:$ict.mfr,fnc:()=>$inv.mfrrel(n)}),$("#topbar").ocmsmenu(r)},$inv.emOpt=()=>"iss,p13b,ctp,setst,setm",$inv.eM=(e,t,n)=>{let i=[];return!0!==booln(e,!1)&&!0!==booln(t,!1)||i.push({glyph:"glyphicon-menu-left",fnc:()=>{$fis.lf(!0),$fis.frm_edit().remove()}}),!0===(n||"").split(",").includes("iss")&&i.push({lbl:$ict.iss,fnc:$inv.ssave}),!0===(n||"").split(",").includes("ctp")&&i.push({lbl:$ict.ctp,fnc:$inv.sctp}),!0===(n||"").split(",").includes("p13b")&&i.push({lbl:$ict.p13b,fnc:$inv.sp13b}),!0===(n||"").split(",").includes("setm")&&i.push({lbl:$ict.setm,fnc:$inv.ssetmode}),!0===(n||"").split(",").includes("setst")&&i.push({lbl:$ict.setst,fnc:()=>$inv.sets.open()}),!0===(n||"").split(",").includes("iss")&&(i.push({lbl:"Änderungshistorie",fnc:()=>$inv.d.history()}),i.push({lbl:"Änderungen verwerfen",fnc:()=>$inv.d.discard()})),!0===booln(e,!1)&&i.push({lbl:$ict.rel,fnc:$inv.rReload}),$("#topbar").ocmsmenu(i)},$inv.pdfPreviewTimeout=12e4,$inv.pdfPreviewFailed=function(e,t){if(11110===(e||{}).internalCode)return void $ocms.login.dlg();let n=((e||{}).internalText||"").trim();""===n&&"timeout"===t&&(n=$ict.pvto),""===n&&410===(e||{}).status&&(n=$ict.pvgone),alert(($ict.pvf||$t.f1)+(""!==n?"\n"+n:""))},$inv.pdfPreviewComplete=function(e,t){return(n,i)=>{t&&t.c.trigger("modal_close"),e&&e.rC("freeze"),"timeout"===i&&$inv.pdfPreviewFailed(n,i)}},$inv.pdfWaitDlg=function(){let e=$ocms.dlg($$.dc("rfrm").ldng(1),{exclusive:!1,zindex_min:50});return e&&e.ft.rwText($ict.pvw),e},$inv.d={tbl:()=>$("div.invoice_layout table.invi"),layout:()=>$("div.invoice_layout"),token:function(){return $inv.d.tbl().data("dtoken")||""},hashes:function(){let e=$inv.d.tbl().data("bai")||[],t={};return $.each(e,((e,n)=>{t[(n.Id||"").toString()]=JSON.stringify(n)})),t},seed:function(e){let t=$inv.d.layout();t.aC("freeze");let n=$ocms.postXT({url:$ocms.url("inv/dopen"),data:{payload:JSON.stringify(e)},success:e=>{$inv.d.tbl().data("dtoken",e.token).data("dver",e.version).data("dhashes",$inv.d.hashes()).data("dorder",$inv.d.order()),$fis.draft.bind(e.token,{onReady:()=>$inv.d.refresh(),onExpiring:e=>$inv.d.warnExpiry(e),onClosed:e=>$inv.d.closed(e)}),$inv.d.refresh()},error:()=>{t.rC("freeze")},complete:()=>{$inv.d.tbl().removeData("dseeding").removeData("dseedpromise")}});return $inv.d.tbl().data("dseedpromise",n),n},refresh:function(e){let t=$inv.d.token();""!==t&&$ocms.postXT({url:$ocms.url("inv/dstate"),data:{token:t},success:t=>{$inv.d.applyState(t),"function"==typeof e&&e(t)},error:e=>{e&&410===e.status&&$inv.d.closed("expired")},complete:()=>{$inv.d.layout().rC("freeze")}})},applyState:function(e){let t=$inv.d.tbl();if(t.length<1)return;let n=t.data("dver");"number"==typeof n&&"number"==typeof e.version&&e.version$$.dc("dnote").aC(e.style||"InvoiceNotes").text(e.text)))},applyItems:function(e,t){let n=e=>void 0===e?null:e;(t||[]).forEach((t=>{if(!t)return;let i=(t.Id||"").toString();if(""===i)return;let r=e.children("tbody").filter(((e,t)=>(($(t).data()||{}).Id||"").toString()===i)).first();if(r.length<1)return;let a=t.itm||[],s={},l=r.find("tr.title").first(),d=l.length?l:null;a.forEach((e=>{let t=(e.id||"").toString();if(""===t)return;s[t]=!0;let i=r.find("#itm"+t).first(),a=i.length<1;a&&(i=$$.tr(r,{id:"itm"+t,class:"itm"}));let l=i.data()||{},c=a||(l.Type||"")!==(e.typ||"")||l.net!==n(e.v)||l.net_val!==n(e.vt)||l.vat_val!==n(e.vv)||l.svcnet_val!==n(e.vs)||l.svcvat_val!==n(e.vsv)||(l.position||"")!==(null!=e.p?e.p:"")||(l.lvl||0)!==(e.lvl||0)||(l.SetItmId||null)!==(null!=e.SetItmId?e.SetItmId:null);$.extend(l,{Id:t,Type:e.typ,net:n(e.v),net_val:n(e.vt),vat_val:n(e.vv),svcnet_val:n(e.vs),svcvat_val:n(e.vsv),vat:e.vat,position:null!=e.p?e.p:"",SetItmId:null!=e.SetItmId?e.SetItmId:null,lvl:e.lvl||0}),a&&$.extend(l,{htmltext:e.t,quantity:e.q}),i.data(l),d?i.prev()[0]!==d[0]&&i.insertAfter(d):r.children().first()[0]!==i[0]&&r.prepend(i),d=i,c&&$inv.rrw.call(i)})),r.find("tr.itm").each(((e,t)=>{let n=(($(t).data()||{}).Id||"").toString();""===n||s[n]||$(t).remove()}))}))},applySetDisplay:function(e,t){e.find("tr.itm").each(((e,n)=>{let i=$(n),r=((i.data()||{}).Id||"").toString();if(""===r||!Object.prototype.hasOwnProperty.call(t,r))return;let a=t[r]||{};i.tC("sethdr",bool(a.h,!1)),!1===bool(a.p,!0)&&i.find("td.currency").text("")}))},sync:function(e){let t=$inv.d.token();if(""===t){let t=$inv.d.tbl().data("dseedpromise");return t?$.when(t).then((()=>$inv.d.sync(e))):$.when()}return $inv.d.layout().aC("freeze"),$ocms.postXT({url:$ocms.url("inv/dpatch"),data:{token:t,delta:JSON.stringify(e)},success:()=>{$inv.d.refresh()},error:e=>{$inv.d.layout().rC("freeze"),e&&410===e.status&&$inv.d.closed("expired")}})},order:function(){return($inv.d.tbl().data("bai")||[]).map((e=>(e.Id||"").toString()))},syncChanged:function(e){let t=e.data("bai")||[],n=e.data("dhashes")||{},i={},r=[],a=[],s=[];$.each(t,((e,t)=>{let a=(t.Id||"").toString(),s=JSON.stringify(t);i[a]=s,n[a]!==s&&r.push(t)})),$.each(n,(e=>{void 0===i[e]&&a.push(e)}));let l=$inv.d.order(),d=e.data("dorder")||[];return e.data("dhashes",i).data("dorder",l),r.forEach((e=>s.push($inv.d.sync({Target:"block.replace",Ref:(e.Id||"").toString(),Value:e})))),a.forEach((e=>s.push($inv.d.sync({Target:"block.remove",Ref:e})))),d.length===l.length&&d.slice().sort().join(",")===l.slice().sort().join(",")&&d.join(",")!==l.join(",")&&s.push($inv.d.sync({Target:"block.order",Value:l})),$.when.apply($,s).promise()},syncField:function(e,t){let n={invoicetitle:"title",invoiceaddress:"address",invoiceemail:"email",invoiceemailcc:"emailcc",loc:"provisionlocation",provisionlocation:"provisionlocation",provisionperiod:"provisionperiod"}[e];n&&$inv.d.sync({Target:n,Value:t})},footer:function(e,t,n){let i=e.children("tfoot").empty();e.nextAll(".fnote").remove();let r=bool(n.p13b,!1),a=(e,t,n)=>$$.tdc("currency",$$.tr(i,{class:n||"tsum"}).append([$$.tdc("aux"),$$.td({colspan:4}).text(e)]),fnum(t,$rct.cst)),s=t=>$$.dc("fnote").insertAfter(e).rwText(t);a("Netto",t.total_net||0),!1===r&&$.each(t.vat||{},((e,t)=>a($rct.vat+" "+e+"%",t,"tvat"))),a("Summe",t.total_gross||0);let l=n.type||"";"i"===l?(s($rct.note2),s($rct.note4)):"c"===l?s($rct.note2):(s(string($rct.note3,[fnum(((t.service_net||0)+(t.service_vat||0))*(n.tax_servicerefund||0),$rct.cst)])).aC("ntax"),s($rct.note2),s(string($rct.note1,[fnum((t.service_net||0)+(t.service_vat||0),$rct.cst),fnum(t.service_net||0,$rct.cst),fnum(t.service_vat||0,$rct.cst)]))),!0===r&&s($rct.note13b)},validation:function(e){let t=$("div.invoice_layout");if(t.length<1)return;let n=t.children(".dvalidation");n.length<1&&(n=$$.dc("dvalidation"),t.prepend(n)),n.empty().tC("hidden",(e||[]).length<1),$.each(e||[],((e,t)=>$$.dc("dvmsg",n).aC(t.severity).text(t.message)))},preview:function(){let e=$inv.d.token();if(""===e)return;let t=$inv.d.layout(),n=($inv.d.tbl().data("new")||{}).invoiceemail||"";!1===$fis.ValidateEmail(n)&&!1===bool(confirm($ict.ivE+$ict.ivEc),!1)||(t.aC("freeze"),$ocms.postXT({url:$ocms.url("inv/dpreview"),data:{token:e},timeout:$inv.pdfPreviewTimeout,success:n=>{t.rC("freeze");let i=$$.dc("imagecollection pdfpreview"),r=Math.round(.88*vh()),a=n.total;a>10&&$$.dc("note warn",i).text($ict.tpe);let s=null;if(""!==(n.backdate||"")){let e=$("").addClass("backdate").attr("title",$ict.bdTT).appendTo(i);s=$('').appendTo(e),$$.s(string($ict.bdLbl,[n.backdate.split("-").reverse().join(".")])).appendTo(e)}$.each(n.img||[],((e,t)=>{$$.dc("pdfp",i).append($$.img(t).css("max-height",(r-rpx(6)).toString()+"px"))}));for(let e=(n.img||[]).length+1;e<=a;e++)$$.dc("pdfp ph",i).append($$.dc("note",$ict.pna));$ocms.dlg(i,{size:[r,Math.round(.88*vw())],zindex:50,form:!1,button:$rct.crI,confirm:function(n){let i=$(this);t.aC("freeze"),$ocms.postXT({url:$ocms.url("inv/dsave"),data:{token:e},success:e=>{$ocms.postXT({url:$ocms.url("req/sconf"),data:{id:e.invid,backdate:s&&s.is(":checked")?1:0},success:t=>{i.trigger("modal_close"),!0===t.hasFile&&window.open($ocms.url("req/idoc")+"?id="+e.invid,"_blank"),$inv.d.close(),$ocms.init("req"),$inv.rReload()},error:()=>{alert($t.f1),i.trigger("modal_close")},complete:()=>{t.rC("freeze")}})},error:()=>{t.rC("freeze"),alert($ict.eis)}})},cancel:function(e){confirm($ict.cdI)&&($inv.d.close(),$inv.rReload())}})},error:$inv.pdfPreviewFailed,complete:$inv.pdfPreviewComplete(t)}))},save:function(){let e=$inv.d.token();if(""===e)return;let t=$inv.d.layout();t.aC("freeze"),$ocms.postXT({url:$ocms.url("inv/dsave"),data:{token:e},success:e=>{$inv.d.tbl().data("invid",e.invid)},error:()=>{alert($ict.eis)},complete:()=>{t.rC("freeze")}})},history:function(){let e=$inv.d.token();""!==e&&$ocms.postXT({url:$ocms.url("inv/dhistory"),data:{token:e},success:e=>{let t=$$.dc("dhist");if((e.history||[]).length<1)$$.dc("note",t).text("Noch keine Änderungen erfasst.");else{let n=$$.tblset({class:"invtbl fullwidth"},t);$$.tr(n.hd).append([$$.th().text("Zeit"),$$.th().text("Feld"),$$.th().text("Alt"),$$.th().text("Neu")]),$.each(e.history,((e,t)=>$$.tr(n.bdy).append([$$.tdc("keep",fdt(t.timestamp)),$$.td().text(t.target),$$.td().text(t.oldValue),$$.td().text(t.newValue)])))}$ocms.dlg(t,{width:800,form:!1})}})},discard:function(){let e=$inv.d.tbl().data("invid")||"";""!==e?!1!==confirm("Alle Änderungen verwerfen und den zuletzt gespeicherten Stand neu laden?")&&($inv.d.close(),$inv.cntInv({id:e})):alert("Es wurde noch kein Zwischenstand gespeichert, der wiederhergestellt werden könnte.")},warnExpiry:function(e){let t=Math.max(1,Math.round((e||0)/60));$fis.notifications.push({severity:"info",title:"Entwurf läuft ab",message:"Der Rechnungsentwurf läuft in etwa "+t+" Minute(n) ab. Bitte zwischenspeichern, sonst gehen die Änderungen verloren."})},closed:function(e){let t=$inv.d.token();$inv.d.tbl().removeData("dtoken"),""!==t&&$fis.draft.release(t),$fis.frm_edit().remove(),$fis.lf(!0),$fis.notifications.push({severity:"error",title:"Entwurf geschlossen",message:"expired"===e?"Der Rechnungsentwurf ist wegen Inaktivität abgelaufen. Nicht gespeicherte Änderungen sind verloren.":"Der Rechnungsentwurf wurde geschlossen."});try{$inv.rReload()}catch(e){}},close:function(){let e=$inv.d.token();""!==e&&($ocms.postXT({url:$ocms.url("inv/dclose"),data:{token:e}}),$fis.draft.release(e)),$inv.d.tbl().removeData("dtoken")}},$inv.rd={tbl:()=>$("div.invoice_layout table.invi"),layout:()=>$("div.invoice_layout"),token:function(){return $inv.rd.tbl().data("rdtoken")||""},seed:function(e){let t=$inv.rd.layout();t.aC("freeze"),$ocms.postXT({url:$ocms.url("rem/dopen"),data:{payload:JSON.stringify(e)},success:e=>{$inv.rd.tbl().data("rdtoken",e.token).data("rdver",e.version),$fis.draft.bind(e.token,{onReady:()=>$inv.rd.refresh(),onExpiring:e=>$inv.rd.warnExpiry(e),onClosed:e=>$inv.rd.closed(e)}),$inv.rd.refresh()},error:()=>{t.rC("freeze")}})},refresh:function(e){let t=$inv.rd.token();""!==t&&$ocms.postXT({url:$ocms.url("rem/dstate"),data:{token:t},success:t=>{$inv.rd.applyState(t),"function"==typeof e&&e(t)},error:e=>{e&&410===e.status&&$inv.rd.closed("expired")},complete:()=>{$inv.rd.layout().rC("freeze")}})},applyState:function(e){let t=$inv.rd.tbl();if(t.length<1)return;let n=t.data("rdver");"number"==typeof n&&"number"==typeof e.version&&e.version{let t=$$[0]("p").aC("dnote intro").rwText(e);r.length?t.insertBefore(r):t.appendTo(n)})),((e||{}).closing||[]).forEach((e=>$$[0]("p").aC("dnote closing").rwText(e).appendTo(n)))},sync:function(e){let t=$inv.rd.token();""!==t&&($inv.rd.layout().aC("freeze"),$ocms.postXT({url:$ocms.url("rem/dpatch"),data:{token:t,delta:JSON.stringify(e)},success:()=>{$inv.rd.refresh()},error:e=>{$inv.rd.layout().rC("freeze"),e&&410===e.status&&$inv.rd.closed("expired")}}))},syncField:function(e,t){if(""===$inv.rd.token())return;let n={subject:"subject",invoiceaddress:"address",invoiceemail:"email",text:"text"}[e];n&&$inv.rd.sync({Target:n,Value:t})},syncAmount:function(e,t){""!==$inv.rd.token()&&($inv.rd.sync({Target:"amount",Value:(null!=e?e:0).toString()}),$inv.rd.sync({Target:"amount_payed",Value:(null!=t?t:0).toString()}))},footer:function(e,t){let n=e.children("tfoot").empty(),i=$$.tr(n,{class:"tsum"}).append([$$.tdc("aux"),$$.td({colspan:4}).text("Offener Betrag")]);$$.tdc("currency",i,fnum(t.amount_open||0,$rct.cst))},validation:function(e){let t=$inv.rd.layout();if(t.length<1)return;let n=t.children(".dvalidation");n.length<1&&(n=$$.dc("dvalidation"),t.prepend(n)),n.empty().tC("hidden",(e||[]).length<1),$.each(e||[],((e,t)=>$$.dc("dvmsg",n).aC(t.severity).text(t.message)))},preview:function(){let e=$inv.rd.token();if(""===e)return;let t=$inv.rd.layout(),n=($inv.rd.tbl().data("new")||{}).invoiceemail||"";!1===$fis.ValidateEmail(n)&&!1===bool(confirm($ict.ivE+$ict.ivEc),!1)||(t.aC("freeze"),$ocms.postXT({url:$ocms.url("rem/dpreview"),data:{token:e},timeout:$inv.pdfPreviewTimeout,success:n=>{t.rC("freeze");let i=$$.dc("imagecollection pdfpreview"),r=Math.round(.88*vh());$.each(n.img||[],((e,t)=>{$$.dc("pdfp",i).append($$.img(t).css("max-height",(r-rpx(6)).toString()+"px"))})),$ocms.dlg(i,{size:[r,Math.round(.88*vw())],zindex:50,form:!1,button:$ict.remd,confirm:function(n){let i=$(this);t.aC("freeze"),$ocms.postXT({url:$ocms.url("rem/dsave"),data:{token:e},success:e=>{$ocms.postXT({url:$ocms.url("rem/conf"),data:{id:e.remid},success:()=>{i.trigger("modal_close"),window.open($ocms.url("rem/idoc")+"?id="+e.remid,"_blank"),$inv.rd.close(),$ocms.init("req"),$inv.rReload()},error:()=>{alert($t.f1),i.trigger("modal_close")},complete:()=>{t.rC("freeze")}})},error:()=>{t.rC("freeze"),alert($t.f1)}})},cancel:function(e){confirm($ict.cdI)&&($inv.rd.close(),$inv.rReload())}})},error:$inv.pdfPreviewFailed,complete:$inv.pdfPreviewComplete(t)}))},save:function(){let e=$inv.rd.token();if(""===e)return;let t=$inv.rd.layout();t.aC("freeze"),$ocms.postXT({url:$ocms.url("rem/dsave"),data:{token:e},success:e=>{$inv.rd.tbl().data("remid",e.remid)},error:()=>{alert($t.f1)},complete:()=>{t.rC("freeze")}})},history:function(){let e=$inv.rd.token();""!==e&&$ocms.postXT({url:$ocms.url("rem/dhistory"),data:{token:e},success:e=>{let t=$$.dc("dhist");if((e.history||[]).length<1)$$.dc("note",t).text("Noch keine Änderungen erfasst.");else{let n=$$.tblset({class:"invtbl fullwidth"},t);$$.tr(n.hd).append([$$.th().text("Zeit"),$$.th().text("Feld"),$$.th().text("Alt"),$$.th().text("Neu")]),$.each(e.history,((e,t)=>$$.tr(n.bdy).append([$$.tdc("keep",fdt(t.timestamp)),$$.td().text(t.target),$$.td().text(t.oldValue),$$.td().text(t.newValue)])))}$ocms.dlg(t,{width:800,form:!1})}})},warnExpiry:function(e){let t=Math.max(1,Math.round((e||0)/60));$fis.notifications.push({severity:"info",title:"Entwurf läuft ab",message:"Der Mahnentwurf läuft in etwa "+t+" Minute(n) ab. Bitte zwischenspeichern, sonst gehen die Änderungen verloren."})},closed:function(e){let t=$inv.rd.token();$inv.rd.tbl().removeData("rdtoken"),""!==t&&$fis.draft.release(t),$fis.frm_edit().remove(),$fis.lf(!0),$fis.notifications.push({severity:"error",title:"Entwurf geschlossen",message:"expired"===e?"Der Mahnentwurf ist wegen Inaktivität abgelaufen. Nicht gespeicherte Änderungen sind verloren.":"Der Mahnentwurf wurde geschlossen."});try{$inv.rReload()}catch(e){}},close:function(){let e=$inv.rd.token();""!==e&&($ocms.postXT({url:$ocms.url("rem/dclose"),data:{token:e}}),$fis.draft.release(e)),$inv.rd.tbl().removeData("rdtoken")}},$inv.cInv2=function(e){let t=$$.dc("rfrm").ldng(1),n=$ocms.dlg(t,{width:1e3});n&&n.ft.rwText($rct.rq1);let i=()=>{$ocms.postXT({url:$ocms.url("req/get"),timeout:60,data:{id:e.id,mode:"r"},success:t=>{t.admin=t.admin||{};let n=$fis.lf(!0).aC("fix").rC("hd");if($fis.frm_edit().IN(),$inv.eM(!0,!0),(t.requests||[]).length<1)n.aC("fix").text($rct.nd);else{$$.dc("lh",n,$rct.mdl);let i=$$.d(),r=$$.ul({class:"rql"}).data({search:e.id,parent:t.admin.parent}).appendTo(n),a={},s=$rcol.req.lbl();$.each(t.requests||[],(function(e,t){let n=$$.li({class:"cli rli"}).data($.extend({},t)).appendTo(r),l=$$.dc("lihd",n).addClass(t.state);!0===booln(t.open,!1)&&l.append($$.sc("cbox").click((()=>{n.tC("checked"),i.find("li").rC("checked"),!0===n.is(".checked")?$inv.rMn(t.open):$inv.eM(!0)}))),l.append([$$.sc("eid",t.ExternalId),$$.sc("nme",t.Name)]),$$.dc("lidt",n).append([$$.dc("rqs").append([$$.s(s.State+": "),$$.s($rct.sts[t.State||"-"])]),$$.dc("ivn").append([$$.s(s.InvoiceId+": "),$$.s(t.InvoiceId||"- -")]),$$.dc("wda").append([$$.s(s.WorkDoneAt+": "),$$.s(fdt(t.WorkDoneAt,"dd.MM.yyyy"))])]),a[t.Id]=n})),(t.inv||[]).length>0&&($$.dc("lh",n,$rct.invs),i=$$.ul({class:"ivl"}).appendTo(n),$.each(t.inv||[],((e,t)=>{let n=$$.li({class:"cli ili"}).data($.extend({},t)).appendTo(i),a=$$.dc("lihd",n).addClass(t.invstatus);!1===booln(t.isFinal,!0)?a.append($$.sc("cbox").click((()=>{""!==(t.Id||"")&&(n.tC("checked").siblings().rC("checked"),r.find("li").rC("checked"),!0===n.is(".checked")?$inv.iMnr(t):$inv.eM(!0))}))):["","dft"].indexOf(t.invstatus)<0&&a.append($$.sc("dli").click((function(){$inv.disp(t.Id,"inv")}))),a.append($$.sc("nme",t.DocumentName||t.Id)),$$.dc("lidt",n).append([$$.dc("wda").append([$$.s(fdt(t.InvoiceDate||t.DateCreated,"dd.MM.yyyy"))]),$$.d().text($ict.iSt[t.invstatus]||t.invstatus)])})))}},complete:()=>{n&&n.c.trigger("modal_close")}})};$ocms.postXT({url:$ocms.url("req/pget"),timeout:90,data:{id:e.id},success:e=>{n&&n.ft.rwText($rct.rq2),i()},error:()=>{confirm($rct.rq1f)?(n&&n.ft.rwText($rct.rq2),i()):n&&n.c.trigger("modal_close")}})},$inv.ccInv=function(e){let t=(e.data||{}).typ||"r",n=$fis.lf(),i=n.children("ul.rql"),r=i.data("parent"),a=[];if(i.find("li.rli.checked").each((function(){a.push($(this).data("Id"))})),a.length<1)return void alert($rct.dnS);if("i"===t&&a.length>1)return void alert($rct.dII);let s=$fis.frm_edit(),l=$$.dc("invoice_layout",s).append($$.dc("btn sprev").click($inv.sprev)),d=$fis.cf().width()>l.width()+n.width()+20;n.tC("fix",d).tC("hd",!d),$inv.eM(!1,!0);let c=$$.dc("rfrm").ldng(1),o=$ocms.dlg(c,{width:1e3});o.ft.rwText($rct.rq2),$ocms.postXT({url:$ocms.url("req/iget"),timeout:60,data:{id:r,mode:"ful",typ:t,sel:a.join(",")},success:e=>{let t=$$.dc("srq",l),n=$$.tblset({class:"invi"},t);n.bdy.remove(),n.ft=$$[0]("tfoot"),e.admin=e.admin||{},e.admin.p13b=bool(e.admin.p13b||"",!0===((e.inv||{}).InvoiceOptions||"").split(",").includes("§13b")),n.tbl.data($.extend({new:{},sms:{},itm:{}},{admin:e.admin,companies:e.companies,locations:e.locations}));let i=$$.tr(n.hd).aC("shd").append([$$.th().aC("aux")]);$rct.invHR.forEach((e=>$$.th(i,e))),n.tbl.on("fds.inv",$inv.invSumUpdate),$.each(e.requests||[],(function(t,i){if(0!==(i.Id||0)){let t=$inv.worknotes(i);i.text="i"===e.admin.type?$rct.req+jine([i.ExternalId,i.Name],": ").eine(" ",""):jine([jine([fdt(i.WorkDoneAt,"dd.MM.yy"),i.ExternalId]," - "+$rct.req+" "),t.ne(i.Name)],": \n");let r=$$.tbody(n.tbl).data($.extend({},i));$inv.rendersrq.call(r)}}));let r=$$.tr($$.tbody(n.tbl),{class:"placeholder"}).data({net_val:0,vat_val:0,svcnet_val:0,svcvat_val:0,net:0});$inv.rrw.call(r),n.ft.appendTo(n.tbl);let a,s,d=e.admin||{},c=(e,t,i,r,a)=>{let s=$$.dc("inpfrm",l).aC(e).append("string"==typeof r?$$.dc("ahd",r):r>0?$$.dc("ahd",$rct.frm[i]):null),d=$$.dc("content",s).rwText(t);$$.dc("axf",s).append($$.dc("ibtn edit",{title:$rct.frmTT[i]||$rct.frm[i]}).data("dialog",$rct.frm[i]).append(gi("pencil")).click($.extend({t:d,nme:i,change:e=>{n.tbl.data("new")[i]=e}},a),$inv.eHtml)),n.tbl.data("new")[i]=t};c("tfrm",d.invoicetitle,"invoicetitle",0,null),c("adrfrm",d.invoiceaddress,"invoiceaddress",0,null),c("locfrm","","loc",1,{list:deepCopy(e.locations),lbl:"ref",property:"address"}),$inv.emailFrm(l,n,d.invoiceemail,d.invoiceemailcc),$$.dc("sndfrm",l).append($$.dc("content").text(d.sender)),d.provisionend&&(s=d.provisionstart?$rct.provP:$rct.provD,a=d.provisionstart?fdt(d.provisionstart,"dd.MM.yyyy")+" - "+fdt(d.provisionend,"dd.MM.yyyy"):fdt(d.provisionend,"dd.MM.yyyy")),c("admfrm",a,"provisionperiod",s,1),n.tbl.data("new").CustomValues=d.CustomValues||"",$$.dc("inpfrm ctpfrm",l).text(jObj(d.CustomValues,"contactName")),n.tbl.children("tbody").each($inv.bdysort),n.tbl.trigger("fds.inv"),$inv.eM(!1,!0,$inv.emOpt())},complete:()=>{o.c.trigger("modal_close")}})},$inv.ccStInv=function(e){let t=e.data||{},n=$fis.lf(),i=t.id,r=$$.dc("invoice_layout",$fis.frm_edit()).append($$.dc("btn sprev").click($inv.sprev)),a=$fis.cf().width()>r.width()+n.width()+20;n.tC("fix",a).tC("hd",!a),$inv.eM(!1,!0);let s=$$.dc("rfrm").ldng(1),l=$ocms.dlg(s,{width:1e3});l.ft.rwText($ict.iq1),$ocms.postXT({url:$ocms.url("inv/pget"),timeout:90,data:{id:t.id},success:e=>{l&&l.ft.rwText($ict.iq2),$ocms.postXT({url:$ocms.url("inv/icget"),timeout:60,data:{id:i},success:e=>{let t=$$.dc("srq",r),n=$$.tblset({class:"invi"},t);n.bdy.remove(),n.ft=$$[0]("tfoot"),e.admin=e.admin||{},e.admin.p13b=bool(e.admin.p13b||"",!0===((e.inv||{}).InvoiceOptions||"").split(",").includes("§13b")),n.tbl.data($.extend({new:{},sms:{},itm:{}},{admin:e.admin,companies:e.companies,locations:e.locations}));let i=$$.tr(n.hd).aC("shd").append([$$.th().aC("aux")]);$rct.invHR.forEach((e=>$$.th(i,e))),n.tbl.on("fds.inv",$inv.invSumUpdate),$.each(e.requests||[],(function(t,i){if(0!==(i.Id||0)){let t=$inv.worknotes(i);i.text="i"===e.admin.type?$rct.req+jine([i.ExternalId,i.Name],": ").eine(" ",""):jine([fdt(i.WorkDoneAt,"dd.MM.yy")+t.ne(i.Name)],": ");let r=$$.tbody(n.tbl).data($.extend({},i));$inv.rendersrq.call(r)}}));let a=$$.tr($$.tbody(n.tbl),{class:"placeholder"}).data({net_val:0,vat_val:0,svcnet_val:0,svcvat_val:0,net:0});$inv.rrw.call(a),n.ft.appendTo(n.tbl);let s,l,d=e.admin||{},c=(e,t,i,a,s)=>{let l=$$.dc("inpfrm",r).aC(e).append("string"==typeof a?$$.dc("ahd",a):a>0?$$.dc("ahd",$rct.frm[i]):null),d=$$.dc("content",l).rwText(t);$$.dc("axf",l).append($$.dc("ibtn edit",{title:$rct.frmTT[i]||$rct.frm[i]}).data("dialog",$rct.frm[i]).append(gi("pencil")).click($.extend({t:d,nme:i,change:e=>{n.tbl.data("new")[i]=e}},s),$inv.eHtml)),n.tbl.data("new")[i]=t};c("tfrm",d.invoicetitle,"invoicetitle",0,null),c("adrfrm",d.invoiceaddress,"invoiceaddress",0,null),c("locfrm",d.provisionlocation,"loc",1,{list:deepCopy(e.locations),lbl:"ref",property:"address"}),$inv.emailFrm(r,n,d.invoiceemail,d.invoiceemailcc),$$.dc("sndfrm",r).append($$.dc("content").text(d.sender)),d.provisionend&&(l=d.provisionstart?$rct.provP:$rct.provD,s=d.provisionstart?fdt(d.provisionstart,"dd.MM.yyyy")+" - "+fdt(d.provisionend,"dd.MM.yyyy"):fdt(d.provisionend,"dd.MM.yyyy")),c("admfrm",s,"provisionperiod",l,1),n.tbl.data("new").CustomValues=d.CustomValues||"",$$.dc("inpfrm ctpfrm",r).text(jObj(d.CustomValues,"contactName")),n.tbl.children("tbody").each($inv.bdysort),n.tbl.trigger("fds.inv")},error:e=>{alert($t.f1+(e&&e.status?e.status:""))},complete:()=>{l.c.trigger("modal_close")}})},error:e=>{l&&l.c.trigger("modal_close"),alert($t.f1+(e&&e.status?e.status:""))}})},$inv.clCntInv=function(e){let t=$fis.lf(!1),n=[];t.find("li.ili.checked").each((function(){n.push($(this).data("Id"))})),1===n.length&&$inv.cntInv({id:n[0]})},$inv.cntInv=function(e){e=e||{};$fis.lf(!1).rC("fix").aC("hd");let t=$$.dc("invoice_layout",$fis.frm_edit()).append($$.dc("btn sprev").click($inv.sedit));$inv.eM(!1,!0);let n=$$.dc("rfrm").ldng(1),i=$ocms.dlg(n,{width:1e3});i.ft.rwText($rct.rq2),$ocms.postXT({url:$ocms.url("inv/get"),timeout:60,data:{id:e.id},success:e=>{e.admin=e.admin||{};let n=e.inv||{},i=$$.dc("srq",t),r=$$.tblset({class:"invi"},i);r.bdy.remove(),r.ft=$$[0]("tfoot"),r.tbl.data($.extend({invid:n.Id,new:{},sms:{},itm:{},bai:[]},e));let a=$$.tr(r.hd).aC("shd").append([$$.th().aC("aux")]);$rct.invHR.forEach((e=>$$.th(a,e))),r.tbl.on("fds.inv",$inv.invSumUpdate),$.each(e.req||[],(function(e,t){let n=$$.tbody(r.tbl).data($.extend({},t));$inv.rendersrq.call(n)}));let s=$$.tr($$.tbody(r.tbl),{class:"placeholder"}).data({net_val:0,vat_val:0,svcnet_val:0,svcvat_val:0,net:0});$inv.rrw.call(s),r.ft.appendTo(r.tbl);let l=(e,n,i,a,s)=>{let l=$$.dc("inpfrm",t).aC(e).append("string"==typeof a?$$.dc("ahd",a):a>0?$$.dc("ahd",$rct.frm[i]):null),d=$$.dc("content",l).rwText(n);$$.dc("axf",l).append($$.dc("ibtn edit",{title:$rct.frmTT[i]||$rct.frm[i]}).data("dialog",$rct.frm[i]).append(gi("pencil")).click($.extend({t:d,nme:i,change:e=>{r.tbl.data("new")[i]=e}},s),$inv.eHtml)),r.tbl.data("new")[i]=n};l("tfrm",n.InvoiceTitle,"invoicetitle",0,null),l("adrfrm",n.SendToAddress,"invoiceaddress",0,null),l("locfrm",n.ProvisionLocation,"loc",1,null),$inv.emailFrm(t,r,n.SendToEmail,n.SendToEmailCc),$$.dc("sndfrm",t).append($$.dc("content").text(e.admin.sender)),l("admfrm",n.ProvisionPeriod,"provisionperiod",!0===(n.ProvisionPeriod||"").includes("-")?$rct.provP:$rct.provD,1),r.tbl.data("new").CustomValues=n.CustomValues||"",$$.dc("inpfrm ctpfrm",t).text(jObj(n.CustomValues,"contactName")),r.tbl.children("tbody").each($inv.bdysort),r.tbl.trigger("fds.inv"),$inv.eM(!1,!0,$inv.emOpt())},complete:()=>{i.c.trigger("modal_close")}})},$inv.cSt=function(e){e=e||{};let t=$fis.lf(),n=$$.dc("invoice_layout",$fis.frm_edit()).append($$.dc("btn sprev").click($inv.sedit)),i=$fis.cf().width()>n.width()+t.width()+20;t.tC("fix",i).tC("hd",!i),$inv.eM(!1,!0);let r=$$.dc("rfrm").ldng(1),a=$ocms.dlg(r,{width:1e3});a.ft.rwText($ict.iq1),$ocms.postXT({url:$ocms.url("inv/pget"),data:{id:e.id},success:t=>{a&&a.ft.rwText($ict.iq2),$ocms.postXT({url:$ocms.url("inv/storno"),data:{id:e.id,mode:e.mode},success:e=>{e.admin=e.admin||{},e.admin.p13b=bool(e.admin.p13b||"",!0===((e.inv||{}).InvoiceOptions||"").split(",").includes("§13b"));let t=e.inv||{},i=$$.dc("srq",n),r=$$.tblset({class:"invi"},i);r.bdy.remove(),r.ft=$$[0]("tfoot"),r.tbl.data($.extend({invid:t.Id,new:{},sms:{},itm:{},bai:[]},e));let a=$$.tr(r.hd).aC("shd").append([$$.th().aC("aux")]);$rct.invHR.forEach((e=>$$.th(a,e))),r.tbl.on("fds.inv",$inv.invSumUpdate),$.each(e.req||[],(function(e,t){let n=$$.tbody(r.tbl).data($.extend({},t));$inv.rendersrq.call(n)}));let s=$$.tr($$.tbody(r.tbl),{class:"placeholder"}).data({net_val:0,vat_val:0,svcnet_val:0,svcvat_val:0,net:0});$inv.rrw.call(s),r.ft.appendTo(r.tbl);let l=(e,t,i,a,s)=>{let l=$$.dc("inpfrm",n).aC(e).append("string"==typeof a?$$.dc("ahd",a):a>0?$$.dc("ahd",$rct.frm[i]):null),d=$$.dc("content",l).rwText(t);$$.dc("axf",l).append($$.dc("ibtn edit",{title:$rct.frmTT[i]||$rct.frm[i]}).data("dialog",$rct.frm[i]).append(gi("pencil")).click($.extend({t:d,nme:i,change:e=>{r.tbl.data("new")[i]=e}},s),$inv.eHtml)),r.tbl.data("new")[i]=t};l("tfrm",t.InvoiceTitle,"invoicetitle",0,null),l("adrfrm",t.SendToAddress,"invoiceaddress",0,null),l("locfrm",t.ProvisionLocation,"loc",1,null),$inv.emailFrm(n,r,t.SendToEmail,t.SendToEmailCc),$$.dc("sndfrm",n).append($$.dc("content").text(e.admin.sender)),l("admfrm",t.ProvisionPeriod,"provisionperiod",!0===(t.ProvisionPeriod||"").includes("-")?$rct.provP:$rct.provD,1),r.tbl.data("new").CustomValues=t.CustomValues||"",$$.dc("inpfrm ctpfrm",n).text(jObj(t.CustomValues,"contactName")),r.tbl.children("tbody").each($inv.bdysort),r.tbl.trigger("fds.inv")},error:e=>{alert($t.f1+(e&&e.status?e.status:""))},complete:()=>{a.c.trigger("modal_close")}})},error:e=>{a&&a.c.trigger("modal_close"),alert($t.f1+(e&&e.status?e.status:""))}})},$inv.adrCountries=[["DE","Deutschland"],["AT","Österreich"],["CH","Schweiz"],["FR","Frankreich"],["NL","Niederlande"],["BE","Belgien"],["LU","Luxemburg"],["IT","Italien"],["ES","Spanien"],["PL","Polen"],["DK","Dänemark"],["CZ","Tschechien"],["GB","Großbritannien"],["US","USA"]],$inv.composeAddress=function(e){let t=[],n=e=>{""!==(e=(""+(e||"")).trim())&&t.push(e)};n((e=e||{}).name),""!==(""+(e.contact||"")).trim()&&n("z.Hd. "+(""+e.contact).trim()),n(e.line2||e.addressLine2),n(e.street),n(((e.postalCode||"")+" "+(e.city||"")).trim());let i=(""+(e.countryCode||"")).toUpperCase();return""!==i&&"DE"!==i&&n(i),t.join("\n")},$inv.adrCurrent=function(e){let t=jObj((e.data("new")||{}).CustomValues,"sendToAddress");if("string"==typeof t&&"{"===t.trim().charAt(0))try{t=JSON.parse(t)}catch(e){t=null}if(t&&"object"==typeof t)return t;let n=(e.data("admin")||{}).invoiceaddressData;if("string"==typeof n&&"{"===n.trim().charAt(0))try{return JSON.parse(n)}catch(e){}else if(n&&"object"==typeof n)return n;return{}},$inv.eAddress=function(e){let t=$inv.d.tbl(),n=$inv.adrCurrent(t),i=[{name:"name",label:"Name / Firma",type:"text",value:n.name||"",required:!0},{name:"contact",label:"z.Hd. (optional)",type:"text",value:n.contact||""},{name:"street",label:"Straße + Nr.",type:"text",value:n.street||""},{name:"line2",label:"Adresszusatz (optional)",type:"text",value:n.line2||n.addressLine2||""},{name:"postalCode",label:"PLZ",type:"text",value:n.postalCode||""},{name:"city",label:"Ort",type:"text",value:n.city||""},{name:"countryCode",label:"Land",type:"select",url:$inv.adrCountries,value:n.countryCode||"DE"},{name:"vatId",label:"USt-IdNr. (nur bei Firmen)",type:"text",value:n.vatId||""},{name:"leitwegId",label:"Leitweg-ID (nur Behörden / B2G)",type:"text",value:n.leitwegId||""}],r=$$.dc("adr-conformity").append([$$.dc("hd").text("Hinweis zur DATEV-/eRechnungs-Konformität"),$$.dc("tx").text("Pflicht: Name, Straße, PLZ, Ort und Land. Die USt-IdNr. nur bei Firmen angeben — für eine Rechnung an eine Privatperson einfach leer lassen. Eine Leitweg-ID nur bei Behörden (B2G) — dann wird die Rechnung automatisch als XRechnung erzeugt.")]);$ocms.dlgform(i,{title:"Rechnungsempfänger",addcontent:r,success:function(t){let n={name:t.name||"",contact:t.contact||"",line2:t.line2||"",street:t.street||"",postalCode:t.postalCode||"",city:t.city||"",countryCode:t.countryCode||"DE",vatId:(""+(t.vatId||"")).trim(),leitwegId:(""+(t.leitwegId||"")).trim()},i=$inv.composeAddress(n);e.data&&e.data.t&&e.data.t.rwText(i),"function"==typeof(e.data||{}).change&&e.data.change(i),$inv.d.sync({Target:"address",Value:n})}})},$inv.provToIso=function(e){let t=(""+(e||"")).match(/(\d{1,2})\.(\d{1,2})\.(\d{4})/);return t?t[3]+"-"+("0"+t[2]).slice(-2)+"-"+("0"+t[1]).slice(-2):""},$inv.eProvisionPeriod=function(e){let t=(""+(e.data&&e.data.t?e.data.t.text():"")).trim().match(/\d{1,2}\.\d{1,2}\.\d{4}/g)||[],n=[{name:"von",label:"Leistungsdatum",type:"date",value:$inv.provToIso(t[0]||"")},{name:"bis",label:"Leistungszeitraum – bis (optional)",type:"date",value:$inv.provToIso(t[1]||"")}],i=$$.dc("adr-conformity").append([$$.dc("hd").text("Leistungsdatum / -zeitraum"),$$.dc("tx").text('Für ein einzelnes Datum nur „Leistungsdatum" ausfüllen; für einen Zeitraum zusätzlich das Bis-Datum. Nur strukturierte Datumsauswahl — für die E-Rechnung empfohlen.')]);$ocms.dlgform(n,{title:"Leistungsdatum / -zeitraum",addcontent:i,success:function(t){let n=(""+(t.von||"")).trim(),i=(""+(t.bis||"")).trim(),r=""===n?"":""===i||i===n?n:n+" - "+i;e.data&&e.data.t&&e.data.t.rwText(r),"function"==typeof(e.data||{}).change&&e.data.change(r),$inv.d.sync({Target:"provisionperiod",Value:r})}})},$inv.eEmail=function(e){let t=[{name:"email",label:$rct.frm.invoiceemail,type:"text",value:(e.data.t||$$.s()).text()},{name:"emailcc",label:$rct.frm.invoiceemailcc,type:"text",value:(e.data.ccT||$$.s()).text()}];$ocms.dlgform(t,{title:$rct.frm.invoiceemail,success:function(t){let n=(""+(t.email||"")).trim(),i=(""+(t.emailcc||"")).trim();e.data&&e.data.t&&e.data.t.text(n),e.data&&e.data.ccT&&e.data.ccT.text(i),"function"==typeof(e.data||{}).change&&e.data.change(n),"function"==typeof(e.data||{}).changeCc&&e.data.changeCc(i),$inv.d.syncField("invoiceemail",n),$inv.rd.syncField("invoiceemail",n),$inv.d.syncField("invoiceemailcc",i),$inv.rd.syncField("invoiceemailcc",i)}})},$inv.emailFrm=function(e,t,n,i){let r=$$.dc("inpfrm emailccfrm",e),a=$$.dc("content",r).rwText(i),s=$$.dc("inpfrm emailfrm",e),l=$$.dc("content",s).rwText(n);$$.dc("axf",s).append($$.dc("ibtn edit",{title:$rct.frmTT.invoiceemail}).append(gi("pencil")).click({t:l,ccT:a,nme:"invoiceemail",change:e=>{t.tbl.data("new").invoiceemail=e},changeCc:e=>{t.tbl.data("new").invoiceemailcc=e}},$inv.eHtml)),t.tbl.data("new").invoiceemail=n,t.tbl.data("new").invoiceemailcc=i},$inv.eHtml=function(e){if(e.data&&!(e.data instanceof jQuery)&&$inv.d&&"function"==typeof $inv.d.token&&""!==$inv.d.token()){if("invoiceaddress"===e.data.nme)return $inv.eAddress.call(this,e);if("provisionperiod"===e.data.nme)return $inv.eProvisionPeriod.call(this,e)}if(e.data&&!(e.data instanceof jQuery)&&"invoiceemail"===e.data.nme&&e.data.ccT)return $inv.eEmail.call(this,e);let t=$(this),n=e.data instanceof jQuery?e.data:e.data.t,i=["invoiceemail","invoiceemailcc","provisionperiod","invoicetitle"].includes(e.data.nme),r=i?[{name:"txt",label:"Text",type:"text",value:n.text()}]:[{name:"txt",label:"Text",type:"html",value:n.html(),tinymce:!0,attr:{style:"height: 300px"}}],a=e.data.change||null,s={title:t.data("dialog")||"",success:function(t){i?n.text(t.txt||""):n.html(t.txt),"function"==typeof a&&a(t.txt),$inv.d.syncField(e.data.nme,i?t.txt||"":t.txt),$inv.rd.syncField(e.data.nme,i?t.txt||"":t.txt)},tinymce:{valid_elements:"br",hidemenu:!0,hidetoolbar:!0}};if(Array.isArray(e.data.list)){let t=$$.dc("lstfrm");$.each(e.data.list,((n,i)=>{let r=$$.dc("li",t).append(""!==(e.data.lbl||"")?$$.dc("lbl").rwText(i[e.data.lbl]):null);$$.dc("adr",r).rwText(i[e.data.property]).data("val",i[e.data.property]).click((function(){let e=$(this),t=e.closest(".modal-body").find(':input[name="txt"]');t.is(".tinymce")?tinymce.get(t.attr("id")).setContent($$.s().rwText(e.data("val")).html()):"TEXTAREA"===t.prop("tagName")?t.val(e.data("val")).change():t.rwText(e.data("val"))}))})),s.addcontent=t}$ocms.dlgform(r,s)},$inv.setVat=function(e){$(this);let t=e.data,n=prompt($rct.rqV);n&&(n=parseFloat(n.replace("%","")),n>1&&(n*=.01),!1===isNaN(n)&&(t.siblings(".itm").each((function(){$(this).data().vat=fnum(n,{style:"percent"}).replace(" ","")})),$inv.t_fds_inv()))},$inv.inRow=function(e){let t=$(this),n=e.data,i={},r=$rcol.itm.clone(["SortOrder","NameOrNumber","Type","quantityhours","UnitString","net","svcnet_val","svcvat_val","net_val","vat_val","vat","Note"]),a="N"+(65536*(1+Math.random())||0).toString(16).substr(6),s=$$.tr({id:"itm_"+a.toString(),class:"itm"});$ocms.dlgform(r,{title:t.data("dialog")||"",success:function(e){s.data($.extend({Id:a},i,e)),$inv.rrw.call(s),s.insertAfter(n),$inv.t_fds_inv()},typedvalues:!0})},$inv.eRow=function(e){let t=$(this),n=e.data,i=n.data()||{},r=["SortOrder","NameOrNumber","Type","quantityhours","UnitString","net","svcnet_val","svcvat_val","net_val","vat_val","vat","Note"];i.id||""!==(i.Type||"")||r.unshift("Type");let a=$rcol.itm.clone(r).applyValues(i);a.set("Type","hidden","type"),$inv.eRw.call(t,n,i,a)},$inv.eRw=function(e,t,n){let i=$(this);$ocms.dlgform(n,{title:i.data("dialog")||"",success:function(n){let i={};""===(t.Id||"")&&(i.Id="N"+(65536*(1+Math.random())||0).toString(16).substr(6),e.attr("id","itm_"+i.Id.toString())),i.quantity=((n.quantityhours||"").toString()+" "+(n.UnitString||"").toString()).trimEnd(),e.data($.extend({},t,n,i)),console.debug("eRw success %o",e.data()),$inv.rrw.call(e),$inv.t_fds_inv()},typedvalues:!0})},$inv.bdysort=(e,t)=>{$(t).Sortable({dragItem:!1,dragHandleClass:"ico",parentident:"tr",onend:()=>{$inv.t_fds_inv()}})},$inv.rowCtxMenu=function(e){let t=$$[0]("nav").aC("rowctx");return t.ocmsmenu([{glyph:"glyphicon-option-vertical",aclass:"ctxbtn",attr:{title:$rct.ctxM},itm:e}]),t.find("li[title]").each((function(){let e=$(this);e.children("a").attr("title",e.attr("title"))})),t},$inv.rrw=function(){let e=$(this),t=e.data(),n={},i=e.is(".placeholder"),r=e.is(".hidenote"),a=e=>$$.d().append(e).html(),s=[{lbl:$rct.iRb,attr:{title:$rct.iRb},data:e,fnc:$inv.inRow}];!1===i&&(s.unshift({lbl:$rct.cP,attr:{title:$rct.cP},data:e,fnc:$inv.eRow}),s.push({lbl:$rct.dR,attr:{title:$rct.dR},fnc:function(t){confirm($rct.cD)&&(e.remove(),$inv.t_fds_inv())}}),"set"===(t.Type||"").toLowerCase()&&0===(t.net_val||0)&&s.push({lbl:$rct.toSetP,attr:{title:$rct.toSetP},data:e,fnc:$inv.toSetPrice}));let l=$$.dc("axf").append($inv.rowCtxMenu(s));!0===i?n={id:"",typ:"placeholder"}:!0===e.is(".itm.osum")?n={invrqid:t.InvRqId,id:"osum"+e.index(),typ:"osum",p:"",q:null,t:a(t.tbl.tbl),tt:null,v:null,vt:t.net_val,vs:t.svcnet_val,vat:t.vat,vv:t.vat_val,vsv:t.svcvat_val,det:!1}:(n={invrqid:t.InvRqId,id:t.Id||"",typ:t.Type||"other",p:"",q:null,t:"",tt:null,v:null,vt:t.net_val,vs:t.svcnet_val,vat:t.vat,vv:t.vat_val,vsv:t.svcvat_val,det:""!==(t.Note||"")&&!1===r,SetItmId:t.SetItmId||null,lvl:t.lvl||0,ref:t.reference_InvId||null},$$.dc("ibtn ico move",l,{title:$rct.mR}),n.p=null!=t.position?t.position:t.SortOrder||"",""===n.id?n.t="":["Text","Title"].includes(n.typ)&&0===(t.net_val||0)?n.t=t.htmltext||("#"!==(t.NameOrNumber||"").substr(0,1)?a($$[0]("p").text(t.NameOrNumber)):"")+(t.Note||""):(n.tt=n.det?"":$$.s(t.Note||"").text(),n.q=t.quantity||(0!==(t.quantityhours||0)?fnum(t.quantityhours)+" "+(t.UnitString||""):""),n.t=t.htmltext||(n.det?a($$.s(t.NameOrNumber||""))+a($$.dc("desc").html(t.Note)):a($$.s(t.NameOrNumber||""))),n.v=t.net,n.vt=t.net_val)),""!==(t.Note||"")&&$$.dc("ibtn add",l,{title:$rct.noteToggle}).append(gi("object-align-left")).click((function(t){$inv.rrw.call(e.tC("hidenote"))}));let d=[$$.tdc("aux").append(l),$$.tdc("keep").text(n.p)];if(""===n.id)d.push($$.td(e,{colspan:4}).append(n.t));else{Array.prototype.push.apply(d,n.q?[$$.tdc("keep").text(n.q)]:[]);let e=e=>null==e?"":fnum(e,$rct.cst);Array.prototype.push.apply(d,[$$.tdc("txt",{colspan:n.q?1:2,title:n.tt}).append(n.t),$$.tdc("currency").text(e(n.v)),$$.tdc("currency inetval").text(e(n.vt)).attr("title",$rct.svcPart+": "+e(n.vs))])}e.empty().attr("class",i?"placeholder":"itm").aC(n.Typ).tC("sethdr","set"===(n.typ||"").toString().toLowerCase()).aC((n.lvl||0)>0?"lvl"+Math.min(n.lvl,6):"").tC("hidenote",r).append(d),t.co=n},$inv.toSetPrice=function(e){let t=(e.data.data().Id||"").toString();""!==t&&!1!==confirm($rct.toSetPc)&&$.when($inv.t_fds_inv()).done((()=>{$inv.d.sync({Target:"item.setprice",Ref:t})}))},$inv.invSumUpdate=function(){let e=$(this),t=[],n=e.children("tbody"),i=[];n.each(((e,n)=>{let r=$(n),a=r.data()||{},s=[],l=[],d=r.find("tr.itm");r.tC("empty",d.length<1),d.each(((e,t)=>{let n=$(t).data()||{};s.push(n.co);let r=$inv.itemToContract(n),a=(n.SetItmId||"").toString();""!==a&&a!==r.id&&(r.setId=a),l.push(r);let d=!1===["text","title"].includes((n.Type||"other").toLowerCase());n.position=((e,t)=>{if(!e)return"";let n=Math.max(t||0,0);for(;i.length<=n;)i.push(0);return i.length=n+1,i[n]++,i.join(".")})(d,(n.co||{}).lvl||0),$inv.rrw.call(t)})),t.push({Id:a.Id,nme:a.Name,text:a.text,itm:s,items:l})}));let r=e.find("tbody:not(.empty)").length;n.find("tr.isum").tC("hidden",r<2),e.data("bai",t),""===(e.data("dtoken")||"")&&!1===bool(e.data("dseeding"),!1)&&null!=(e.data("admin")||{}).type&&(e.data("dseeding",!0),$inv.d.seed($.extend($inv.invcPayload(e.data()),{invid:e.data("invid")||""})))},$inv.worknotes=function(e){let t="";return e.steps.forEach(((e,n)=>{let i;try{i=JSON.parse(e.Data||{}).fields||[]}catch(e){console.debug(e),i=[]}!0!==Array.isArray(i||"")&&(i="object"==typeof i&&!0===Array.isArray(i.field||"")?i.field:[]),i.forEach(((e,n)=>{"Ausgeführte Arbeiten"===e.name&&(t=e.result||"")}))})),t},$inv.rendersrq=function(){let e=$(this).empty(),t=e.is(".onesum"),n=e.data(),i=$$.tr(e,{id:"srq"+n.Id}).aC("title nosort"),r=($rcol.itm.lbl(),$$.dc("axf").appendTo($$.tdc("aux",i)));$$.dc("ibtn osum",r,{title:$rct.combP}).append(gi("euro")).click((function(t){e.tC("onesum"),$inv.rendersrq.call(e),$inv.t_fds_inv()})),$$.dc("ibtn setvat",r,{title:$rct.sV}).append(gi("gbp")).click(i,$inv.setVat),$$.dc("ibtn insb",r,{title:$rct.iRb}).append(gi("indent-left")).click(i,$inv.inRow);let a,s=$$.sc("text",n.text),l=($$.td(i,{colspan:t?4:5}).append(s),["net_val","vat_val","svcnet_val","svcvat_val","net"]);if($$.dc("ibtn edit",r,{title:$rct.sectionTitleEditTT}).data("dialog",$rcol.req.lbl().Name).append(gi("pencil")).click({t:s,change:e=>{n.text=e,$inv.t_fds_inv()}},$inv.eHtml),t&&($$.tdc("currency isumval",i),a={Id:n.Id.toString()+"_osum",net_val:0,vat_val:0,svcnet_val:0,svcvat_val:0,net:0},a.tbl=$$.tblset({class:"stbl"})),$.each(n.items||[],((n,i)=>{let r,s={Id:i.Id,net_val:i.net_val||0,vat_val:i.vat_val||0,svcnet_val:0,svcvat_val:0,net:i.net||0,Note:i.Note||""};if("service"===i.Type.toLowerCase())s.svcnet_val=i.net_val||0,s.svcvat_val=i.vat_val||0;t?(r=$$.tr(a.tbl.bdy,{id:"itm"+i.Id,class:"sitm"}).aC(i.Type),"Text"===i.Type||"Title"===i.Type?$$.td(r,{colspan:2}).html(i.htmltext||i.Note):($$.tdc("keep",r).text(i.quantity||((i.quantityhours||0)>0?fnum(i.quantityhours)+(i.UnitString||"").eine(" ",""):"")),i.htmltext?$$.tdc("txt",r).html(i.htmltext):$$.tdc("txt",r).text(i.NameOrNumber).attr("title",i.Note)),$.each(l,((e,t)=>{a[t]+=s[t]})),r.data(s)):($.extend(s,i),r=$$.tr(e,{id:"itm"+i.Id,class:"itm"}),r.data(s),$inv.rrw.call(r))})),t){let t=$$.tr(e,{id:"itmsq"+n.Id,class:"itm osum"}).data(a);$inv.rrw.call(t)}else{let t=$$.tr(e).aC("isum nosort");$$.tdc("aux",t),$$.td(t,{colspan:4}).text($rct.iSum),$$.tdc("currency isumval",t)}},$inv.t_fds_inv=()=>{let e=$("div.invoice_layout table.invi");if(e.trigger("fds.inv"),""!==(e.data("dtoken")||""))return $inv.d.syncChanged(e);let t=e.data("dseedpromise");return t?$.when(t).then((()=>$inv.d.syncChanged(e))):$.when()},$inv.sedit=()=>{$inv.sprev(!0)},$inv.jdisp=function(e){e.stopPropagation(),e.data.id&&$inv.disp(e.data.id,e.data.typ||"")},$inv.disp=(e,t)=>{let n="";switch(t){case"inv":n="inv/rdoc";break;case"rem":n="rem/rdoc"}if(""!==n){let t=$inv.pdfWaitDlg();$ocms.postXT({url:$ocms.url(n),data:{id:e||"",typ:"img"},timeout:$inv.pdfPreviewTimeout,success:e=>{let t=$$.dc("imagecollection pdfpreview"),n=Math.round(.88*vh());e.id;$.each(e.img||[],(function(e,i){$$.dc("pdfp",t).append($$.img(i).css("max-height",(n-rpx(6)).toString()+"px"))})),$ocms.dlg(t,{size:[n,Math.round(.88*vw())],zindex_min:50,form:!1,exclusive:!1})},error:$inv.pdfPreviewFailed,complete:$inv.pdfPreviewComplete(null,t)})}},$inv.jdbn=function(e){let t=$inv.pdfWaitDlg();$ocms.postXT({url:$ocms.url("inv/rdocn"),data:{name:e.data.id||"",typ:"img"},timeout:$inv.pdfPreviewTimeout,success:e=>{let t=$$.dc("imagecollection pdfpreview"),n=Math.round(.88*vh());e.id;$.each(e.img||[],(function(e,i){$$.dc("pdfp",t).append($$.img(i).css("max-height",(n-rpx(6)).toString()+"px"))})),$ocms.dlg(t,{size:[n,Math.round(.88*vw())],zindex:50,form:!1})},error:$inv.pdfPreviewFailed,complete:$inv.pdfPreviewComplete(null,t)})},$inv.sp13b=()=>{var e=$("div.invoice_layout").find("table.invi"),t=e.data();t.admin.p13b=!0,!1===(t.inv.InvoiceOptions||"").split(",").includes("§13b")&&(t.inv.InvoiceOptions+=",§13b"),e.trigger("fds.inv"),$inv.d.sync({Target:"p13b",Value:t.admin.p13b})},$inv.itemToContract=function(e){let t=((e=e||{}).Type||"").toString().toLowerCase(),n=e=>e??null,i={id:(e.Id||"").toString(),type:t,title:"",desc:"",qty:"",price_net:"",total_net:n(e.net_val),vat:e.vat||""};var r;return e.co&&"osum"===e.co.typ?(i.desc=e.co.t||"",i.total_net=e.net_val||0):["text","title"].includes(t)&&0===(e.net_val||0)?(i.desc=e.htmltext||("#"!==(e.NameOrNumber||"").substr(0,1)?(r=$$[0]("p").text(e.NameOrNumber||""),$$.d().append(r).html()):"")+(e.Note||""),i.total_net=""):(e.htmltext?i.desc=e.htmltext:(i.title=e.NameOrNumber||"",i.desc=e.Note||""),i.qty=e.quantity||(0!==(e.quantityhours||0)?fnum(e.quantityhours)+(e.UnitString?" "+e.UnitString:""):""),i.price_net=n(e.net),i.total_net=n(e.net_val)),i},$inv.hasSets=e=>((e||{}).req||[]).some((e=>{let t=((e||{}).itm||[]).filter((e=>e&&""!==(e.id||""))),n={};t.forEach((e=>{n[(e.id||"").toString()]=e}));return t.some((e=>{let t=(null==e.SetItmId?"":e.SetItmId).toString();return""!==t&&t!==(e.id||"").toString()&&n[t]&&(e=>"set"===(e.typ||"").toString().toLowerCase())(n[t])}))})),$inv.ssetmode=()=>{let e,t=$("div.invoice_layout").find("table.invi").data();if(t.dstate&&!1===$inv.hasSets(t.dstate))return void alert($rct.toSetMn);let n=t=>$$.dc("btn",$ict.setmo[t]).click((()=>{e.c.trigger("modal_close"),$inv.setSetmode(t)})),i=$$.dc("choicefrm").append([n("setprice"),n("setonly")]);e=$ocms.dlg(i,{width:800})},$inv.setSetmode=e=>{if(!1===confirm($rct.toSetMc||$rct.toSetPc))return;let t="setonly"===e?"block.setonly":"block.setprice";$.when($inv.t_fds_inv()).done((()=>{$inv.d.sync({Target:t})}))},$inv.sctp=()=>{let e=$invcol.ctp;$ocms.dlgform(e,{title:$ict.ctp,success:function(e){var t=$("div.invoice_layout"),n=t.find("table.invi").data();let i={};void 0!==n.new&&"{"===(n.new.CustomValues||"").substr(0,1)&&(i=JSON.parse(n.inv.CustomValues)),i.contactName=e.name,i.contactEmail=e.email,n.new.CustomValues=JSON.stringify(i),t.find(".ctpfrm").text(ne(e.name,e.email)),$inv.d.sync({Target:"contact",Value:{name:e.name,email:e.email}})},typedvalues:!0})},$inv.invcPayload=function(e){e=e||{};let t=$.extend({},e.new),n=$.extend({},e.admin);return t.title=null!=t.invoicetitle?t.invoicetitle:t.title||"",t.provisionlocation=null!=t.loc?t.loc:t.provisionlocation||"",t.paymentterm=null!=n.paymentterms?n.paymentterms:t.paymentterm||"",n.customerid=null!=n.customerid?n.customerid:n.CustomerId,{admin:n,req:e.bai,new:t}},$inv.ssave=()=>{$inv.d.save()},$inv.sprev=e=>{$inv.d.preview()},$inv.rReload=()=>{try{let e=$("#listframe ul.rql:first").data();$inv.cInv2({id:e.search})}catch(e){}},$inv.quantChange=function(e){},$inv.storno=function(e,t){let n,i=$$.dc("choicefrm").append([$$.dc("btn","Storno ohne Details").click({id:e,mode:"simple"},(e=>{n.c.trigger("modal_close"),$inv.cSt(e.data)})),$$.dc("btn","Storno mit neuer Rechnung").click({id:e},(e=>{n.c.trigger("modal_close"),$inv.ccStInv(e)})),$$.dc("btn","Storno mit best. Rechnung").tC("inactive",!1===bool(t,!1)).click({id:e,mode:"copy"},(e=>{!0===bool(t,!1)&&(n.c.trigger("modal_close"),$inv.cSt(e.data))}))]);n=$ocms.dlg(i,{width:1e3})},$inv.credit=function(e,t){let n,i=$$.dc("choicefrm").append([$$.dc("btn","Gutschrift").click({id:e,mode:"credit"},(e=>{n.c.trigger("modal_close"),$inv.cSt(e.data)}))]);n=$ocms.dlg(i,{width:1e3})},$inv.setPyd=function(e){confirm($ict.cpyd)&&$ocms.postXT({url:$ocms.url("inv/setpyd"),timeout:60,data:{id:e},success:e=>{alert($ict.relm)},error:()=>{alert($t.f1)}})},$inv.setUpd=function(e){confirm($ict.cupd)&&$ocms.postXT({url:$ocms.url("inv/setupd"),timeout:60,data:{id:e},success:e=>{alert($ict.relm)},error:()=>{alert($t.f1)}})},$inv.resendRem=function(e){e.stopPropagation(),e.data.id&&confirm(string($ict.remresc,[e.data.name]))&&$ocms.postXT({url:$ocms.url("rem/resend"),timeout:60,data:{id:e.data.id},success:t=>{alert(string($ict.remresr,[e.data.name]))},error:()=>{alert($t.f1)}})},$inv.dspRem=function(e){let t=$$.dc("rfrm").ldng(1),n=$ocms.dlg(t,{width:1e3});n.ft.rwText($rct.rq2),$ocms.postXT({url:$ocms.url("inv/getrem"),timeout:60,data:{id:e,drafts:!1},success:e=>{n.ft.empty();let i=$$.tblset({class:"invtbl"},t.empty()),r=$invcol.rem2,a=$$.tr(i.hd);$$.th(a);$.each(r.fields||[],((e,t)=>{$$.th(a).text(t.label)}));let s=!1;$.each(e,((e,t)=>{s=!s;let n=$$.tr(i.bdy).tC("alt",s),a=$$.td(n);n.click((function(){n.tC("selected").siblings().rC("selected")})),!0===bool(t.hasFile,!1)&&($$.dc("idl ilbtn",a,{title:$ict.dl+"\n"+t.DocumentName}).append(gi("save-file","ico")).click({id:t.Id},$inv.downloadrem),$$.dc("idl ilbtn",a,{title:$ict.remdsp+"\n"+t.DocumentName}).append(gi("eye-open","ico")).click({id:t.Id,typ:"rem"},$inv.jdisp),$$.dc("idl ilbtn",a,{title:$ict.remres+"\n"+t.DocumentName}).append(gi("refresh","ico")).click({id:t.Id,typ:"rem",name:t.DocumentName},$inv.resendRem)),$.each(r.fields||[],((e,i)=>{let r=$$.td(n).aC(i.dtype),a=t[i.name];if("function"==typeof i.dfnc)i.dfnc.call(r,a,t);else switch(i.type||""){case"date":r.text(fdt(t[i.name],"dd.MM.yy"));break;case"datetime":r.text(fdt(t[i.name]));break;case"html":r.append($$.dc("ctw").html(a)),r.append($$.dc("ttip").html(a));break;default:r.text(t[i.name])}if("InvoiceId"===(i.name||""))r.aC("keep");switch(typeof i.title){case"function":i.title.call(r,t);break;case"string":r.attr("title",cs.title)}}))}))},error:()=>{t.empty(),n.ft.rwText($t.f1)},complete:()=>{t.ldng(0)}})},$inv.ccRem=function(e,t){$(this);$ocms.postXT({url:$ocms.url("rem/lrem"),timeout:60,data:{id:e},success:n=>{let i=$invcol.rid.clone();i.applyValues(n.ov);let r=$$.dc("ac"),a=$$.tblset({class:"fullgrid fullwidth"},r);if((n.lst||[]).length>0){$$.d({style:"margin: 1.5rem 0 1rem 0;font-size: 110%;text-decoration: underline;"}).prependTo(r).text($ict.rovlh);let e=$$.tr(a.hd);$ict.rovl.forEach(((t,n)=>$$.th(e,t))),$.each(n.lst,((e,t)=>{$$.tr(a.bdy).append([$$.tdc("keep",t.subject),$$.tdc("currency",fnum(t.amount,$rct.cst)),$$.tdc("currency",fnum(t.amount_payed,$rct.cst)),$$.tdc("keep",fdt(t.DateFinalized,"dd.MM.yy"))])}))}else $$.td($$.tr(a.bdy),$ict.nd);$ocms.dlgform(i,{addcontent:r,title:string($ict.remdt,[t||"?"]),success:function(t){$inv.ccRem_s2(e,t)},typedvalues:!0})}})},$inv.rRemRw=function(e){let t=$(this),n=e.rm||{};t.empty().data({invoiceid:n.invoiceid,invoicedate:n.invoicedate,amount:n.amount,amount_payed:n.amount_payed});let i=[{lbl:$rct.cP,attr:{title:$rct.cP},data:t,fnc:$inv.eRowR}],r=$$.dc("axf").append($inv.rowCtxMenu(i));t.append([$$.tdc("aux").append(r),$$.tdc("keep",n.invoiceid),$$.tdc("keep",fdt(n.invoicedate,"dd.MM.yy")),$$.tdc("currency",fnum(n.amount,$rct.cst)),$$.tdc("currency",fnum(n.amount_payed,$rct.cst)),$$.tdc("currency",fnum(n.amount-n.amount_payed,$rct.cst))])},$inv.eRowR=function(e){let t=$(this),n=e.data,i=n.data()||{},r=$invcol.rem.clone().applyValues(i);$ocms.dlgform(r,{title:t.data("dialog")||"",success:function(e){let i=t.closest("table"),r=i.data();$.extend(r.rm,e),i.data(r),$inv.rRemRw.call(n,r),$inv.rd.syncAmount(r.rm.amount,r.rm.amount_payed)},typedvalues:!0})},$inv.ccRem_s2=function(e,t){$fis.lf(!1).rC("fix").aC("hd");let n=$$.dc("invoice_layout",$fis.frm_edit()).append($$.dc("btn sprev").click($inv.rprev));$inv.eM(!1,!0);$$.dc("rfrm").ldng(1);$ocms.postXT({url:$ocms.url("rem/get"),timeout:60,data:$.extend({id:e},t),success:e=>{let t=e.rm||{},i=$$.dc("srq",n),r=$$.tblset({class:"invi"},i);r.ft=$$[0]("tfoot"),r.tbl.data($.extend({invid:t.invid,new:{}},e));let a=$$.tr(r.hd).aC("shd").append([$$.th().aC("aux")]);$ict.remHR.forEach((e=>$$.th(a,e))),$inv.rRemRw.call($$.tr(r.bdy),r.tbl.data()),r.ft.appendTo(r.tbl);let s={invoiceemail:"Email-Adresse ändern",subject:"Betreff ändern"},l=(e,t,i,a,l)=>{let d=$$.dc("inpfrm",n).aC(e).append("string"==typeof a?$$.dc("ahd",a):a>0?$$.dc("ahd",$rct.frm[i]):null),c=$$.dc("content",d).rwText(t);$$.dc("axf",d).append($$.dc("ibtn edit",{title:s[i]||$rct.frmTT[i]||$rct.frm[i]}).data("dialog",$rct.frm[i]).append(gi("pencil")).click($.extend({t:c,nme:i,change:e=>{r.tbl.data("new")[i]=e}},l),$inv.eHtml)),r.tbl.data("new")[i]=t};l("tfrm",t.subject,"subject",0,null),l("adrfrm",t.invoiceaddress,"invoiceaddress",0,null),l("emailfrm",t.invoiceemail,"invoiceemail",0,null),$$.dc("sndfrm",n).append($$.dc("content").text(t.sender)),r.tbl.children("tbody").each($inv.bdysort),r.tbl.trigger("fds.inv");let d=r.tbl.data("new");d.amount=t.amount,d.amount_payed=t.amount_payed,$inv.rd.seed({rem:{invid:t.invid,type:t.type,invoiceid:t.invoiceid,invoicedate:t.invoicedate},new:d})},complete:()=>{}})},$inv.rprev=()=>{$inv.rd.preview()},$inv.sis=e=>{confirm($ict.sisc)&&$ocms.postXT({url:$ocms.url("inv/sis"),data:{id:e||""},success:e=>{}})},$inv.srs=e=>{confirm($ict.srsc)&&$ocms.postXT({url:$ocms.url("rem/srs"),data:{id:e||""},success:e=>{}})},$inv.mfrrel=e=>{$("#contentframe").ldng(),$ocms.postXT({url:$ocms.url("inv/mfrrel"),data:{id:e||""},success:e=>{$inv.rerenderinv()},complete:()=>{$("#contentframe").ldng(0)}})},$inv.sets={o:null,c:null,drag:null,isOpen:()=>!!$inv.sets.o,open:function(){let e=$inv.d.tbl();if(e.length<1||$inv.sets.isOpen())return;if(""===$inv.d.token()&&!e.data("dstate"))return;let t=$$.dc("setstruct");$inv.sets.c=t,$inv.sets.o=$ocms.dlg(t,{title:$ict.setst,size:[-1,960],exclusive:!1,close:()=>{$inv.sets.o=null,$inv.sets.c=null,$inv.sets.drag=null}});let n=e.data("dstate");n?$inv.sets.render(n):$inv.d.refresh()},title:e=>{let t=$$.d().html(e.t||"").text().replace(/\s+/g," ").trim();return""!==t?t:$ict.setsNoTitle||""},typLbl:e=>{let t=(e.typ||"").toString().toLowerCase();return($ict.settyp||{})[t]||e.typ||""},isSet:e=>"set"===(e.typ||"").toString().toLowerCase(),parentOf:(e,t)=>{let n=(null==e.SetItmId?"":e.SetItmId).toString(),i=(e.id||"").toString();if(""===n||n===i)return"";let r=t[n];return r&&$inv.sets.isSet(r)?n:""},isDescendant:(e,t,n)=>{let i={},r=n[e];for(;r;){let e=$inv.sets.parentOf(r,n);if(""===e||i[e])return!1;if(e===t)return!0;i[e]=!0,r=n[e]}return!1},canDrop:(e,t,n,i)=>!!e&&e.bid===n&&e.id!==t&&!$inv.sets.isDescendant(t,e.id,i),sync:e=>($inv.sets.c&&$inv.sets.c.aC("busy"),$inv.d.sync(e)),render:function(e){let t=$inv.sets.c;if(!t)return;let n=t.closest(".modal-body"),i=n.length?n.scrollTop():0;t.empty().rC("busy"),$$.dc("shint",t).text($ict.setsHint||""),(e.req||[]).forEach((e=>{if(!e)return;let n=(e.Id||"").toString();if(""===n)return;let i=(e.itm||[]).filter((e=>e&&""!==(e.id||""))),r={};i.forEach((e=>{r[(e.id||"").toString()]=e}));let a=$$.dc("sblock",t).data({bid:n});$inv.sets.rootZone($$.dc("sbhd",a).append($$.sc("nme",e.text||e.nme||n)),n,r);let s=$$.tblset({class:"stbl"},a),l=$$.tr(s.hd);($ict.setsHR||[]).forEach((e=>$$.th(l,e))),i.forEach((e=>$inv.sets.row(s.bdy,e,n,i,r))),$inv.sets.rootZone($$.dc("sroot",a).text($ict.setsRoot||""),n,r),$inv.sets.createBar(a,n,i,r)})),n.length&&n.scrollTop(i)},collapsed:{},hiddenByCollapse:function(e,t){let n={},i=e;for(;i;){let e=$inv.sets.parentOf(i,t);if(""===e||n[e])return!1;if($inv.sets.collapsed[e])return!0;n[e]=!0,i=t[e]}return!1},zone:function(e,t,n){let i=e.originalEvent||e,r=t[0].getBoundingClientRect(),a=(i.clientY||0)-r.top,s=r.height||1;return a<.3*s?"before":a>.7*s||!n?"after":"into"},clearDrop:()=>{$(".setstruct .dropok, .setstruct .dropbefore, .setstruct .dropafter").rC("dropok dropbefore dropafter")},row:function(e,t,n,i,r){let a=(t.id||"").toString(),s=parseInt(t.lvl||0,10)||0,l=$inv.sets.isSet(t),d=$inv.sets.parentOf(t,r),c=l&&!!$inv.sets.collapsed[a],o=$$.tr(e,{draggable:"true"}).aC("srow lvl"+s).tC("isset",l).tC("folded",c).data({id:a,bid:n});$inv.sets.hiddenByCollapse(t,r)&&o.aC("hid"),$$.tdc("grip",o).append(gi("move")).attr("title",$rct.mR),$$.tdc("pos",o).text(null!=t.p?t.p:"");let u=$$.tdc("typ",o);l&&u.append($$.sc("fold").attr("title",c?$ict.setsExpand:$ict.setsCollapse).append(gi(c?"triangle-right":"triangle-bottom")).click((e=>{e.stopPropagation(),c?delete $inv.sets.collapsed[a]:$inv.sets.collapsed[a]=!0;let t=$inv.d.tbl().data("dstate");t&&$inv.sets.render(t)}))),u.append($$.s($inv.sets.typLbl(t))),$$.tdc("qty",o).text(t.q||"");let m=$$.tdc("ttl",o);if(""!==d&&m.append($$.sc("seti",$inv.sets.title(r[d]))),m.append($$.sc("txt",$inv.sets.title(t)).click((function(e){e.stopPropagation(),$(this).tC("exp")}))),l){let e=i.filter((e=>$inv.sets.parentOf(e,r)===a)).length;m.append($$.sc("cnt"," ("+e+")"))}let v=i.filter((e=>$inv.sets.parentOf(e,r)===d)),p=v.findIndex((e=>(e.id||"").toString()===a)),f=v.slice(0,p).some((e=>$inv.sets.isSet(e))),h=$$.tdc("act",o),g=(e,t,n,i,r)=>$$.dc("ibtn "+e,h,{title:n}).append(gi(t)).tC("disabled",!i).click((()=>{i&&$inv.sets.sync(r)}));g("up","arrow-up",$ict.setsUp,p>0,{Target:"set.move",Ref:a,Value:-1}),g("down","arrow-down",$ict.setsDown,p>=0&&p0,{Target:"set.level",Ref:a,Value:-1}),g("in","chevron-right",$ict.setsIn,f,{Target:"set.level",Ref:a,Value:1}),o.on("dragstart",(e=>{$inv.sets.drag={id:a,bid:n},o.aC("dragging");try{e.originalEvent.dataTransfer.setData("text/plain",a),e.originalEvent.dataTransfer.effectAllowed="move"}catch(e){}})).on("dragend",(()=>{o.rC("dragging"),$inv.sets.drag=null,$inv.sets.clearDrop()}));return o.on("dragover",(e=>{if(!$inv.sets.canDrop($inv.sets.drag,a,n,r))return;e.preventDefault();let t=$inv.sets.zone(e,o,l);o.rC("dropok dropbefore dropafter").aC("into"===t?"dropok":"before"===t?"dropbefore":"dropafter")})).on("dragleave",(()=>{o.rC("dropok dropbefore dropafter")})).on("drop",(e=>{e.preventDefault(),$inv.sets.clearDrop();let t=$inv.sets.drag;if($inv.sets.drag=null,!$inv.sets.canDrop(t,a,n,r))return;let i=$inv.sets.zone(e,o,l);"into"===i?$inv.sets.sync({Target:"set.assign",Ref:t.id,Value:{parent:a}}):$inv.sets.sync({Target:"set.move",Ref:t.id,Value:{anchor:a,where:i}})})),o},rootZone:function(e,t,n){return e.on("dragover",(i=>{(()=>{let e=$inv.sets.drag;return!!e&&e.bid===t&&!!n[e.id]&&""!==$inv.sets.parentOf(n[e.id],n)})()&&(i.preventDefault(),e.aC("dropok"))})).on("dragleave",(()=>{e.rC("dropok")})).on("drop",(i=>{i.preventDefault(),e.rC("dropok");let r=$inv.sets.drag;$inv.sets.drag=null,r&&r.bid===t&&n[r.id]&&""!==$inv.sets.parentOf(n[r.id],n)&&$inv.sets.sync({Target:"set.assign",Ref:r.id,Value:{parent:""}})})),e},createBar:function(e,t,n,i){let r=$$.dc("screate",e),a=$("").attr({name:"typ"}).append([$$.opt("set",$ict.settyp.set),$$.opt("text",$ict.settyp.text)]),s=$("").attr({name:"parent"}).append($$.opt("",$ict.setsTop));n.forEach((e=>{if(!$inv.sets.isSet(e))return;let t=parseInt(e.lvl||0,10)||0;s.append($$.opt((e.id||"").toString()," ".repeat(3*t)+$inv.sets.title(e)))}));let l=$('').attr({name:"title",placeholder:$ict.setsTitle,maxlength:250}),d=()=>{let e=(l.val()||"").toString().trim();""!==e?($inv.sets.sync({Target:"set.create",Ref:t,Value:{typ:a.val(),title:e,parent:s.val()||""}}),l.val("")):l.focus()};return l.on("keydown",(e=>{"Enter"===e.key&&(e.preventDefault(),d())})),r.append([$$.sc("lbl",$ict.setsNew),a,$$.sc("lbl",$ict.setsInto),s,l,$$.bbtn($ict.setsAdd,"sadd").click(d)]),r}}; \ No newline at end of file diff --git a/Fuchs/wwwroot/web/fisb.css b/Fuchs/wwwroot/web/fisb.css index 9b708fa..fd68cdd 100644 --- a/Fuchs/wwwroot/web/fisb.css +++ b/Fuchs/wwwroot/web/fisb.css @@ -243,6 +243,21 @@ div.modal > .modal-dialog > .modal-content .modal-header, div.modal > .modal-dia div.modal > .modal-dialog > .modal-content .modal-header + div, div.modal > .modal-dialog > .modal-content .modal-body + div, div.modal > .modal-dialog > .modal-content .modal-footer + div, div.modal > .modal-dialog > .modal-content .modal-note + div { border-top: 1px solid #e5e5e5; } +div.modal > .modal-dialog > .modal-content .modal-body { + /* admin "Rechnungsdatum Vormonat" option in the invoice preview dialog (ADR 0032) */ +} +div.modal > .modal-dialog > .modal-content .modal-body > .imagecollection > label.backdate { + display: block; + margin: 0 0 1rem 0; + padding: 0.5rem 1rem; + background-color: #fff8e1; + border: 1px solid #f0c36d; + font-weight: bold; + cursor: pointer; +} +div.modal > .modal-dialog > .modal-content .modal-body > .imagecollection > label.backdate > input { + margin-right: 0.5rem; +} div.modal > .modal-dialog > .modal-content .modal-body > .choicefrm { padding: 1rem; } diff --git a/Fuchs/wwwroot/web/fisb.min.css b/Fuchs/wwwroot/web/fisb.min.css index 9f7e696..23691e4 100644 --- a/Fuchs/wwwroot/web/fisb.min.css +++ b/Fuchs/wwwroot/web/fisb.min.css @@ -1 +1 @@ -*,:after,:before{box-sizing:border-box;transition:visibility 1s linear,opacity 1s linear;-moz-transition:visibility 1s linear,opacity 1s linear;-webkit-transition:visibility 1s linear,opacity 1s linear}body,html{-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility;image-rendering:auto;shape-rendering:geometricprecision;color-rendering:optimizeQuality;font-size:14px;background-color:#1b4379}@media (max-width:796px) and (min-width:362px){body,html{font-size:15px}}@media (max-width:361px){body,html{font-size:12px}}html{font-family:Arial,Arial,Helvetica Neue,Helvetica,sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{font-family:Arial,Arial,Helvetica Neue,Helvetica,sans-serif;font-weight:400;overflow:hidden;position:relative;height:100vh;width:100vw;margin:0}body.busy,body.busy *{cursor:wait!important}body>*{position:fixed;left:.5rem;right:.5rem}body header{top:.5rem;height:2.3rem;z-index:10;max-height:2.3rem;background-color:#1b4379}body main{background-color:#fff;top:2.8rem;bottom:2.8rem;z-index:9;overflow:auto;position:absolute}body footer{bottom:0;height:2.3rem;max-height:2.3rem;z-index:8;overflow:hidden}.h1,.h2,.h3,.h4,h1,h2,h3,h4{color:#1b4379}.h1,h1{font-size:1.45rem;letter-spacing:.0725rem;font-weight:700;margin:1.45rem 0 .8rem}.h2,h2{font-size:1.35rem;letter-spacing:.0675rem;font-weight:600;margin:1.35rem 0 .7rem}.h3,h3{font-size:1.2rem;letter-spacing:.04rem;font-weight:500;margin:1rem 0 .5rem}.h4,h4{letter-spacing:.015rem;font-weight:400;margin:.6rem 0 .3rem}p{margin:0 0 .6rem}.loading{background-image:url(data:image/gif;base64,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);background-position:center center;background-repeat:repeat-x}#mainframe{top:5px;left:5px;right:5px;bottom:5px}div.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0;display:flex;align-items:center;justify-items:center;justify-content:center;align-content:center;background-color:rgba(50,50,50,.3)}div.modal>.modal-dialog{background-clip:padding-box;display:none;max-width:calc(100vw - 1rem);max-height:calc(100vh - 1rem);-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0);position:relative}div.modal>.modal-dialog.szfull{width:calc(100vw - 5rem);height:calc(100vh - 5rem)}div.modal>.modal-dialog.in{display:block}div.modal>.modal-dialog.fade .out{opacity:0}div.modal>.modal-dialog.fade .in{opacity:1}div.modal>.modal-dialog>.modal-close{position:absolute;top:-.5rem;right:-.5rem;content:"X";height:1.4rem;width:1.4rem;color:#000;z-index:1;border-radius:50%;padding:.5rem;border:1px solid #000;display:block;background:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjwhRE9DVFlQRSBzdmcgIFBVQkxJQyAnLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4nICAnaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkJz48c3ZnIGhlaWdodD0iNTEycHgiIGlkPSJMYXllcl8xIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA1MTIgNTEyOyIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgd2lkdGg9IjUxMnB4IiB4bWw6c3BhY2U9InByZXNlcnZlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj48cGF0aCBkPSJNNDM3LjUsMzg2LjZMMzA2LjksMjU2bDEzMC42LTEzMC42YzE0LjEtMTQuMSwxNC4xLTM2LjgsMC01MC45Yy0xNC4xLTE0LjEtMzYuOC0xNC4xLTUwLjksMEwyNTYsMjA1LjFMMTI1LjQsNzQuNSAgYy0xNC4xLTE0LjEtMzYuOC0xNC4xLTUwLjksMGMtMTQuMSwxNC4xLTE0LjEsMzYuOCwwLDUwLjlMMjA1LjEsMjU2TDc0LjUsMzg2LjZjLTE0LjEsMTQuMS0xNC4xLDM2LjgsMCw1MC45ICBjMTQuMSwxNC4xLDM2LjgsMTQuMSw1MC45LDBMMjU2LDMwNi45bDEzMC42LDEzMC42YzE0LjEsMTQuMSwzNi44LDE0LjEsNTAuOSwwQzQ1MS41LDQyMy40LDQ1MS41LDQwMC42LDQzNy41LDM4Ni42eiIvPjwvc3ZnPg==) center center/75% no-repeat border-box #fff;cursor:pointer}@media (max-width:550px){div.modal>.modal-dialog>.modal-close{height:2rem;width:2rem}}div.modal>.modal-dialog .invalid .modal-footer div.note_invalid{display:inline-block}div.modal>.modal-dialog .modal-footer div.note_invalid{display:none}div.modal>.modal-dialog>.modal-content{position:relative;background-color:#f5f5f5;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.4rem;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);overflow:auto;height:100%;max-height:calc(100vh - 1rem)}div.modal>.modal-dialog>.modal-content .modal-header.fix{position:absolute;top:0;left:0}div.modal>.modal-dialog>.modal-content .modal-body,div.modal>.modal-dialog>.modal-content .modal-footer,div.modal>.modal-dialog>.modal-content .modal-header,div.modal>.modal-dialog>.modal-content .modal-note{width:100%;display:block;position:relative;padding:1rem}div.modal>.modal-dialog>.modal-content .modal-body+div,div.modal>.modal-dialog>.modal-content .modal-footer+div,div.modal>.modal-dialog>.modal-content .modal-header+div,div.modal>.modal-dialog>.modal-content .modal-note+div{border-top:1px solid #e5e5e5}div.modal>.modal-dialog>.modal-content .modal-body>.choicefrm{padding:1rem}div.modal>.modal-dialog>.modal-content .modal-body>.choicefrm>div{display:block;margin:1rem}div.modal>.modal-dialog>.modal-content .modal-body>.choicefrm>div:hover{background-color:#eee}div.modal>.modal-dialog>.modal-content .modal-body>.choicefrm>div.btn.inactive{cursor:not-allowed;text-decoration:line-through}div.modal>.modal-dialog>.modal-content .modal-body table .ilbtn{display:inline-block}div.modal>.modal-dialog>.modal-content .modal-body table.fullgrid{border-collapse:collapse}div.modal>.modal-dialog>.modal-content .modal-body table.fullgrid td,div.modal>.modal-dialog>.modal-content .modal-body table.fullgrid th{padding:.1rem .5rem;border:1px solid #ccc}div.modal>.modal-dialog>.modal-content .modal-body table.fullgrid th{font-weight:bolder;border-bottom-width:2px}div.modal>.modal-dialog>.modal-content .modal-body table.fullwidth{width:100%}div.modal>.modal-dialog>.modal-content .modal-footer{text-align:right}div.modal>.modal-dialog>.modal-content .modal-footer div.note_required{float:left;font-size:.7rem}div.modal>.modal-dialog>.modal-content .modal-footer div.note_invalid{color:red;font-size:1rem;float:left;clear:both;margin-top:.5rem}div.modal>.modal-dialog>.modal-content .modal-note#dataprivacy{font-size:.8rem}div.modal>.modal-dialog>.modal-content .frm.c13{display:inline-flex;vertical-align:top}div.modal>.modal-dialog>.modal-content .frm.c13:first-child{width:30%}div.modal>.modal-dialog>.modal-content .frm.c13:nth-child(n+2){width:70%;padding-left:1.5rem}#oci_login #dbtn-forgotpw{margin-top:1rem;float:left;clear:both}#oci_login .modal-footer{min-height:5.8rem}.btn,button{border-radius:.28rem;display:inline-block;padding:.45rem 1rem .5rem;margin-bottom:0;font-size:1rem;letter-spacing:.025rem;font-weight:500;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid #ababab;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-box-shadow:1px 1px 3px rgba(50,50,50,.3);box-shadow:1px 1px 3px rgba(50,50,50,.3)}.btn.btn-primary,button.btn-primary{background-color:#1b4379;color:#fff}.btn.btn-sm,button.btn-sm{border-radius:.28rem;padding:.25rem .7rem .3rem;font-size:.8rem;letter-spacing:.015rem}.form,form{height:inherit;width:inherit}.form span.ind_required,form span.ind_required{color:red;font-weight:400;padding-left:5px;padding-right:5px}.form button,.form html input[type=button],.form input[type=reset],.form input[type=submit],form button,form html input[type=button],form input[type=reset],form input[type=submit]{-webkit-appearance:button;cursor:pointer}.form button,.form select,form button,form select{text-transform:none}.form textarea,form textarea{overflow:auto;resize:vertical}.form label,form label{padding-right:1.5rem;display:inline-block;box-sizing:content-box}.form .form-body,form .form-body{display:table;width:100%}@media (max-width:796px){.form .form-body.stacked .form-group,form .form-body.stacked .form-group{margin-bottom:.25rem;display:block}.form .form-body.stacked .form-group .form-itm,form .form-body.stacked .form-group .form-itm{display:block;width:100%;max-width:100%;padding-bottom:.1rem}.form .form-body.stacked .form-group .form-itm:first-child,form .form-body.stacked .form-group .form-itm:first-child{width:100%}}.form .form-body .form-group,form .form-body .form-group{margin-bottom:1rem;display:table-row}.form .form-body .form-group.cgrp,form .form-body .form-group.cgrp{margin-top:1.5rem}.form .form-body .form-group .form-itm,form .form-body .form-group .form-itm{display:table-cell;vertical-align:top;padding-bottom:1rem}.form .form-body .form-group .form-itm:first-child,form .form-body .form-group .form-itm:first-child{width:10%}.form .form-body .form-group .form-itm>table,form .form-body .form-group .form-itm>table{width:100%}.form .form-body .form-group .form-sep,form .form-body .form-group .form-sep{display:table-cell;padding-top:1rem;border-top:1px solid #e5e5e5;height:2px}.form .form-body .form-group .form-control,form .form-body .form-group .form-control{display:block}.form .form-body .form-group input.form-control,.form .form-body .form-group select.form-control,form .form-body .form-group input.form-control,form .form-body .form-group select.form-control{width:100%}.form .form-body .form-group .input-group,form .form-body .form-group .input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.form .form-body .form-group .input-group .input-group-btn,.form .form-body .form-group .input-group .input-group-text,form .form-body .form-group .input-group .input-group-btn,form .form-body .form-group .input-group .input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.3rem}.form .form-body .form-group .input-group .input-group-btn.narrow,.form .form-body .form-group .input-group .input-group-text.narrow,form .form-body .form-group .input-group .input-group-btn.narrow,form .form-body .form-group .input-group .input-group-text.narrow{padding-left:.375rem;padding-right:.375rem}.form .form-body .form-group .input-group .input-group-btn,form .form-body .form-group .input-group .input-group-btn{cursor:pointer}.form .form-body .form-group .input-group .input-group-btn:hover,form .form-body .form-group .input-group .input-group-btn:hover{background-color:#f1f3f5}.form .form-body .form-group .input-group>:not(:last-child),form .form-body .form-group .input-group>:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.form .form-body .form-group .input-group>:not(:first-child),form .form-body .form-group .input-group>:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0;margin-left:-1px}.form .form-body .form-group .input-group>.form-control,.form .form-body .form-group .input-group>.form-select,.form .form-body .form-group .input-group>.form-set,form .form-body .form-group .input-group>.form-control,form .form-body .form-group .input-group>.form-select,form .form-body .form-group .input-group>.form-set{position:relative;flex:1 1 auto;width:1%;min-width:0}.form .form-body .form-group .input-group>.form-set .dropdown-menu,form .form-body .form-group .input-group>.form-set .dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.form .form-body .form-group .input-group>.form-set .dropdown-menu .divider,form .form-body .form-group .input-group>.form-set .dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.form .form-body .form-group .input-group>.form-set .dropdown-menu>li>a,form .form-body .form-group .input-group>.form-set .dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.form .form-body .form-group .input-group>.form-set .dropdown-menu>li>a:focus,.form .form-body .form-group .input-group>.form-set .dropdown-menu>li>a:hover,form .form-body .form-group .input-group>.form-set .dropdown-menu>li>a:focus,form .form-body .form-group .input-group>.form-set .dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.form .form-body .form-group .input-group>.form-set .dropdown-menu>.active>a,.form .form-body .form-group .input-group>.form-set .dropdown-menu>.active>a:focus,.form .form-body .form-group .input-group>.form-set .dropdown-menu>.active>a:hover,form .form-body .form-group .input-group>.form-set .dropdown-menu>.active>a,form .form-body .form-group .input-group>.form-set .dropdown-menu>.active>a:focus,form .form-body .form-group .input-group>.form-set .dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.form .form-body .form-group .input-group>.form-set .dropdown-menu>.disabled>a,.form .form-body .form-group .input-group>.form-set .dropdown-menu>.disabled>a:focus,.form .form-body .form-group .input-group>.form-set .dropdown-menu>.disabled>a:hover,form .form-body .form-group .input-group>.form-set .dropdown-menu>.disabled>a,form .form-body .form-group .input-group>.form-set .dropdown-menu>.disabled>a:focus,form .form-body .form-group .input-group>.form-set .dropdown-menu>.disabled>a:hover{color:#777}.form .form-body .form-group .input-group>.form-set .dropdown-menu>.disabled>a:focus,.form .form-body .form-group .input-group>.form-set .dropdown-menu>.disabled>a:hover,form .form-body .form-group .input-group>.form-set .dropdown-menu>.disabled>a:focus,form .form-body .form-group .input-group>.form-set .dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none}.form .form-body .form-group .input-group>.form-set>.form-control,form .form-body .form-group .input-group>.form-set>.form-control{border-radius:0}.form .form-body .form-group.hd,.form .form-body .form-group>.hd,form .form-body .form-group.hd,form .form-body .form-group>.hd{display:none}.form textarea.form-control,form textarea.form-control{height:5rem}.form textarea.form-control[rows],form textarea.form-control[rows]{height:auto}.form .form-control,form .form-control{appearance:none;display:block;width:100%;height:2.5rem;padding:.5rem .8rem;font-size:1rem;line-height:1.42857143;color:#525252;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:.3rem;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;-o-transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;box-sizing:border-box}.form .form-control:focus,form .form-control:focus{border-color:#1b4379;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(27,67,121,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(27,67,121,.6)}.form .form-control:invalid,form .form-control:invalid{border-color:#da6600}.form .form-control:-ms-input-placeholder,.form .form-control::-moz-placeholder,.form .form-control::-webkit-input-placeholder,form .form-control:-ms-input-placeholder,form .form-control::-moz-placeholder,form .form-control::-webkit-input-placeholder{color:#262626;opacity:1}.form .form-control::-ms-expand,form .form-control::-ms-expand{background-color:transparent;border:0}.form .form-control[size],form .form-control[size]{height:auto}.form .form-control[disabled],.form .form-control[readonly],fieldset[disabled] .form .form-control,fieldset[disabled] form .form-control,form .form-control[disabled],form .form-control[readonly]{background-color:#eee;opacity:1}.form .form-control[disabled],fieldset[disabled] .form .form-control,fieldset[disabled] form .form-control,form .form-control[disabled]{cursor:not-allowed}body.div.pgb{-webkit-pointer-events:none;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.div.pgb .pgb-progress{background:#1ab394;position:fixed;z-index:2040;top:0;right:100%;width:100%;height:2px}body.div.pgb .pgb-progress.inactive{display:none}#topbar{display:block;position:absolute;background-color:#1b4379;left:0;right:0;min-height:2.3rem;height:auto;z-index:4}#topbar.hd{height:0!important;min-height:0;overflow:hidden}#topbar.hd~#contentframe,#topbar.hd~#listframe{top:0}#topbar~#contentframe,#topbar~#listframe{top:2.3rem}#topbar>nav{padding-top:0}#contentframe{position:absolute;overflow:auto;top:0;left:0;right:0;bottom:0;z-index:2}#listframe{position:absolute;overflow:auto;top:2.3rem;left:0;right:auto;bottom:0;min-width:20%;max-width:100%;z-index:3;background-color:#fff;border-right:1px solid #1b4379;transition:width 1s,min-width 1s}#listframe.hd:not(.fix){min-width:0;width:0;overflow:hidden}#sidebar~div{left:2.3rem}body>.timer{position:fixed;bottom:3px;height:1px;border-bottom:2px solid #ff0;transition:width 1s linear;left:0}#oci_login{width:600px} \ No newline at end of file +*,:after,:before{box-sizing:border-box;transition:visibility 1s linear,opacity 1s linear;-moz-transition:visibility 1s linear,opacity 1s linear;-webkit-transition:visibility 1s linear,opacity 1s linear}body,html{-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility;image-rendering:auto;shape-rendering:geometricprecision;color-rendering:optimizeQuality;font-size:14px;background-color:#1b4379}@media (max-width:796px) and (min-width:362px){body,html{font-size:15px}}@media (max-width:361px){body,html{font-size:12px}}html{font-family:Arial,Arial,Helvetica Neue,Helvetica,sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{font-family:Arial,Arial,Helvetica Neue,Helvetica,sans-serif;font-weight:400;overflow:hidden;position:relative;height:100vh;width:100vw;margin:0}body.busy,body.busy *{cursor:wait!important}body>*{position:fixed;left:.5rem;right:.5rem}body header{top:.5rem;height:2.3rem;z-index:10;max-height:2.3rem;background-color:#1b4379}body main{background-color:#fff;top:2.8rem;bottom:2.8rem;z-index:9;overflow:auto;position:absolute}body footer{bottom:0;height:2.3rem;max-height:2.3rem;z-index:8;overflow:hidden}.h1,.h2,.h3,.h4,h1,h2,h3,h4{color:#1b4379}.h1,h1{font-size:1.45rem;letter-spacing:.0725rem;font-weight:700;margin:1.45rem 0 .8rem}.h2,h2{font-size:1.35rem;letter-spacing:.0675rem;font-weight:600;margin:1.35rem 0 .7rem}.h3,h3{font-size:1.2rem;letter-spacing:.04rem;font-weight:500;margin:1rem 0 .5rem}.h4,h4{letter-spacing:.015rem;font-weight:400;margin:.6rem 0 .3rem}p{margin:0 0 .6rem}.loading{background-image:url(data:image/gif;base64,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);background-position:center center;background-repeat:repeat-x}#mainframe{top:5px;left:5px;right:5px;bottom:5px}div.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0;display:flex;align-items:center;justify-items:center;justify-content:center;align-content:center;background-color:rgba(50,50,50,.3)}div.modal>.modal-dialog{background-clip:padding-box;display:none;max-width:calc(100vw - 1rem);max-height:calc(100vh - 1rem);-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0);position:relative}div.modal>.modal-dialog.szfull{width:calc(100vw - 5rem);height:calc(100vh - 5rem)}div.modal>.modal-dialog.in{display:block}div.modal>.modal-dialog.fade .out{opacity:0}div.modal>.modal-dialog.fade .in{opacity:1}div.modal>.modal-dialog>.modal-close{position:absolute;top:-.5rem;right:-.5rem;content:"X";height:1.4rem;width:1.4rem;color:#000;z-index:1;border-radius:50%;padding:.5rem;border:1px solid #000;display:block;background:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjwhRE9DVFlQRSBzdmcgIFBVQkxJQyAnLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4nICAnaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkJz48c3ZnIGhlaWdodD0iNTEycHgiIGlkPSJMYXllcl8xIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA1MTIgNTEyOyIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgd2lkdGg9IjUxMnB4IiB4bWw6c3BhY2U9InByZXNlcnZlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj48cGF0aCBkPSJNNDM3LjUsMzg2LjZMMzA2LjksMjU2bDEzMC42LTEzMC42YzE0LjEtMTQuMSwxNC4xLTM2LjgsMC01MC45Yy0xNC4xLTE0LjEtMzYuOC0xNC4xLTUwLjksMEwyNTYsMjA1LjFMMTI1LjQsNzQuNSAgYy0xNC4xLTE0LjEtMzYuOC0xNC4xLTUwLjksMGMtMTQuMSwxNC4xLTE0LjEsMzYuOCwwLDUwLjlMMjA1LjEsMjU2TDc0LjUsMzg2LjZjLTE0LjEsMTQuMS0xNC4xLDM2LjgsMCw1MC45ICBjMTQuMSwxNC4xLDM2LjgsMTQuMSw1MC45LDBMMjU2LDMwNi45bDEzMC42LDEzMC42YzE0LjEsMTQuMSwzNi44LDE0LjEsNTAuOSwwQzQ1MS41LDQyMy40LDQ1MS41LDQwMC42LDQzNy41LDM4Ni42eiIvPjwvc3ZnPg==) center center/75% no-repeat border-box #fff;cursor:pointer}@media (max-width:550px){div.modal>.modal-dialog>.modal-close{height:2rem;width:2rem}}div.modal>.modal-dialog .invalid .modal-footer div.note_invalid{display:inline-block}div.modal>.modal-dialog .modal-footer div.note_invalid{display:none}div.modal>.modal-dialog>.modal-content{position:relative;background-color:#f5f5f5;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.4rem;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);overflow:auto;height:100%;max-height:calc(100vh - 1rem)}div.modal>.modal-dialog>.modal-content .modal-header.fix{position:absolute;top:0;left:0}div.modal>.modal-dialog>.modal-content .modal-body,div.modal>.modal-dialog>.modal-content .modal-footer,div.modal>.modal-dialog>.modal-content .modal-header,div.modal>.modal-dialog>.modal-content .modal-note{width:100%;display:block;position:relative;padding:1rem}div.modal>.modal-dialog>.modal-content .modal-body+div,div.modal>.modal-dialog>.modal-content .modal-footer+div,div.modal>.modal-dialog>.modal-content .modal-header+div,div.modal>.modal-dialog>.modal-content .modal-note+div{border-top:1px solid #e5e5e5}div.modal>.modal-dialog>.modal-content .modal-body>.imagecollection>label.backdate{display:block;margin:0 0 1rem;padding:.5rem 1rem;background-color:#fff8e1;border:1px solid #f0c36d;font-weight:700;cursor:pointer}div.modal>.modal-dialog>.modal-content .modal-body>.imagecollection>label.backdate>input{margin-right:.5rem}div.modal>.modal-dialog>.modal-content .modal-body>.choicefrm{padding:1rem}div.modal>.modal-dialog>.modal-content .modal-body>.choicefrm>div{display:block;margin:1rem}div.modal>.modal-dialog>.modal-content .modal-body>.choicefrm>div:hover{background-color:#eee}div.modal>.modal-dialog>.modal-content .modal-body>.choicefrm>div.btn.inactive{cursor:not-allowed;text-decoration:line-through}div.modal>.modal-dialog>.modal-content .modal-body table .ilbtn{display:inline-block}div.modal>.modal-dialog>.modal-content .modal-body table.fullgrid{border-collapse:collapse}div.modal>.modal-dialog>.modal-content .modal-body table.fullgrid td,div.modal>.modal-dialog>.modal-content .modal-body table.fullgrid th{padding:.1rem .5rem;border:1px solid #ccc}div.modal>.modal-dialog>.modal-content .modal-body table.fullgrid th{font-weight:bolder;border-bottom-width:2px}div.modal>.modal-dialog>.modal-content .modal-body table.fullwidth{width:100%}div.modal>.modal-dialog>.modal-content .modal-footer{text-align:right}div.modal>.modal-dialog>.modal-content .modal-footer div.note_required{float:left;font-size:.7rem}div.modal>.modal-dialog>.modal-content .modal-footer div.note_invalid{color:red;font-size:1rem;float:left;clear:both;margin-top:.5rem}div.modal>.modal-dialog>.modal-content .modal-note#dataprivacy{font-size:.8rem}div.modal>.modal-dialog>.modal-content .frm.c13{display:inline-flex;vertical-align:top}div.modal>.modal-dialog>.modal-content .frm.c13:first-child{width:30%}div.modal>.modal-dialog>.modal-content .frm.c13:nth-child(n+2){width:70%;padding-left:1.5rem}#oci_login #dbtn-forgotpw{margin-top:1rem;float:left;clear:both}#oci_login .modal-footer{min-height:5.8rem}.btn,button{border-radius:.28rem;display:inline-block;padding:.45rem 1rem .5rem;margin-bottom:0;font-size:1rem;letter-spacing:.025rem;font-weight:500;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid #ababab;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-box-shadow:1px 1px 3px rgba(50,50,50,.3);box-shadow:1px 1px 3px rgba(50,50,50,.3)}.btn.btn-primary,button.btn-primary{background-color:#1b4379;color:#fff}.btn.btn-sm,button.btn-sm{border-radius:.28rem;padding:.25rem .7rem .3rem;font-size:.8rem;letter-spacing:.015rem}.form,form{height:inherit;width:inherit}.form span.ind_required,form span.ind_required{color:red;font-weight:400;padding-left:5px;padding-right:5px}.form button,.form html input[type=button],.form input[type=reset],.form input[type=submit],form button,form html input[type=button],form input[type=reset],form input[type=submit]{-webkit-appearance:button;cursor:pointer}.form button,.form select,form button,form select{text-transform:none}.form textarea,form textarea{overflow:auto;resize:vertical}.form label,form label{padding-right:1.5rem;display:inline-block;box-sizing:content-box}.form .form-body,form .form-body{display:table;width:100%}@media (max-width:796px){.form .form-body.stacked .form-group,form .form-body.stacked .form-group{margin-bottom:.25rem;display:block}.form .form-body.stacked .form-group .form-itm,form .form-body.stacked .form-group .form-itm{display:block;width:100%;max-width:100%;padding-bottom:.1rem}.form .form-body.stacked .form-group .form-itm:first-child,form .form-body.stacked .form-group .form-itm:first-child{width:100%}}.form .form-body .form-group,form .form-body .form-group{margin-bottom:1rem;display:table-row}.form .form-body .form-group.cgrp,form .form-body .form-group.cgrp{margin-top:1.5rem}.form .form-body .form-group .form-itm,form .form-body .form-group .form-itm{display:table-cell;vertical-align:top;padding-bottom:1rem}.form .form-body .form-group .form-itm:first-child,form .form-body .form-group .form-itm:first-child{width:10%}.form .form-body .form-group .form-itm>table,form .form-body .form-group .form-itm>table{width:100%}.form .form-body .form-group .form-sep,form .form-body .form-group .form-sep{display:table-cell;padding-top:1rem;border-top:1px solid #e5e5e5;height:2px}.form .form-body .form-group .form-control,form .form-body .form-group .form-control{display:block}.form .form-body .form-group input.form-control,.form .form-body .form-group select.form-control,form .form-body .form-group input.form-control,form .form-body .form-group select.form-control{width:100%}.form .form-body .form-group .input-group,form .form-body .form-group .input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.form .form-body .form-group .input-group .input-group-btn,.form .form-body .form-group .input-group .input-group-text,form .form-body .form-group .input-group .input-group-btn,form .form-body .form-group .input-group .input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.3rem}.form .form-body .form-group .input-group .input-group-btn.narrow,.form .form-body .form-group .input-group .input-group-text.narrow,form .form-body .form-group .input-group .input-group-btn.narrow,form .form-body .form-group .input-group .input-group-text.narrow{padding-left:.375rem;padding-right:.375rem}.form .form-body .form-group .input-group .input-group-btn,form .form-body .form-group .input-group .input-group-btn{cursor:pointer}.form .form-body .form-group .input-group .input-group-btn:hover,form .form-body .form-group .input-group .input-group-btn:hover{background-color:#f1f3f5}.form .form-body .form-group .input-group>:not(:last-child),form .form-body .form-group .input-group>:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.form .form-body .form-group .input-group>:not(:first-child),form .form-body .form-group .input-group>:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0;margin-left:-1px}.form .form-body .form-group .input-group>.form-control,.form .form-body .form-group .input-group>.form-select,.form .form-body .form-group .input-group>.form-set,form .form-body .form-group .input-group>.form-control,form .form-body .form-group .input-group>.form-select,form .form-body .form-group .input-group>.form-set{position:relative;flex:1 1 auto;width:1%;min-width:0}.form .form-body .form-group .input-group>.form-set .dropdown-menu,form .form-body .form-group .input-group>.form-set .dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.form .form-body .form-group .input-group>.form-set .dropdown-menu .divider,form .form-body .form-group .input-group>.form-set .dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.form .form-body .form-group .input-group>.form-set .dropdown-menu>li>a,form .form-body .form-group .input-group>.form-set .dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.form .form-body .form-group .input-group>.form-set .dropdown-menu>li>a:focus,.form .form-body .form-group .input-group>.form-set .dropdown-menu>li>a:hover,form .form-body .form-group .input-group>.form-set .dropdown-menu>li>a:focus,form .form-body .form-group .input-group>.form-set .dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.form .form-body .form-group .input-group>.form-set .dropdown-menu>.active>a,.form .form-body .form-group .input-group>.form-set .dropdown-menu>.active>a:focus,.form .form-body .form-group .input-group>.form-set .dropdown-menu>.active>a:hover,form .form-body .form-group .input-group>.form-set .dropdown-menu>.active>a,form .form-body .form-group .input-group>.form-set .dropdown-menu>.active>a:focus,form .form-body .form-group .input-group>.form-set .dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.form .form-body .form-group .input-group>.form-set .dropdown-menu>.disabled>a,.form .form-body .form-group .input-group>.form-set .dropdown-menu>.disabled>a:focus,.form .form-body .form-group .input-group>.form-set .dropdown-menu>.disabled>a:hover,form .form-body .form-group .input-group>.form-set .dropdown-menu>.disabled>a,form .form-body .form-group .input-group>.form-set .dropdown-menu>.disabled>a:focus,form .form-body .form-group .input-group>.form-set .dropdown-menu>.disabled>a:hover{color:#777}.form .form-body .form-group .input-group>.form-set .dropdown-menu>.disabled>a:focus,.form .form-body .form-group .input-group>.form-set .dropdown-menu>.disabled>a:hover,form .form-body .form-group .input-group>.form-set .dropdown-menu>.disabled>a:focus,form .form-body .form-group .input-group>.form-set .dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none}.form .form-body .form-group .input-group>.form-set>.form-control,form .form-body .form-group .input-group>.form-set>.form-control{border-radius:0}.form .form-body .form-group.hd,.form .form-body .form-group>.hd,form .form-body .form-group.hd,form .form-body .form-group>.hd{display:none}.form textarea.form-control,form textarea.form-control{height:5rem}.form textarea.form-control[rows],form textarea.form-control[rows]{height:auto}.form .form-control,form .form-control{appearance:none;display:block;width:100%;height:2.5rem;padding:.5rem .8rem;font-size:1rem;line-height:1.42857143;color:#525252;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:.3rem;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;-o-transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;box-sizing:border-box}.form .form-control:focus,form .form-control:focus{border-color:#1b4379;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(27,67,121,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(27,67,121,.6)}.form .form-control:invalid,form .form-control:invalid{border-color:#da6600}.form .form-control:-ms-input-placeholder,.form .form-control::-moz-placeholder,.form .form-control::-webkit-input-placeholder,form .form-control:-ms-input-placeholder,form .form-control::-moz-placeholder,form .form-control::-webkit-input-placeholder{color:#262626;opacity:1}.form .form-control::-ms-expand,form .form-control::-ms-expand{background-color:transparent;border:0}.form .form-control[size],form .form-control[size]{height:auto}.form .form-control[disabled],.form .form-control[readonly],fieldset[disabled] .form .form-control,fieldset[disabled] form .form-control,form .form-control[disabled],form .form-control[readonly]{background-color:#eee;opacity:1}.form .form-control[disabled],fieldset[disabled] .form .form-control,fieldset[disabled] form .form-control,form .form-control[disabled]{cursor:not-allowed}body.div.pgb{-webkit-pointer-events:none;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.div.pgb .pgb-progress{background:#1ab394;position:fixed;z-index:2040;top:0;right:100%;width:100%;height:2px}body.div.pgb .pgb-progress.inactive{display:none}#topbar{display:block;position:absolute;background-color:#1b4379;left:0;right:0;min-height:2.3rem;height:auto;z-index:4}#topbar.hd{height:0!important;min-height:0;overflow:hidden}#topbar.hd~#contentframe,#topbar.hd~#listframe{top:0}#topbar~#contentframe,#topbar~#listframe{top:2.3rem}#topbar>nav{padding-top:0}#contentframe{position:absolute;overflow:auto;top:0;left:0;right:0;bottom:0;z-index:2}#listframe{position:absolute;overflow:auto;top:2.3rem;left:0;right:auto;bottom:0;min-width:20%;max-width:100%;z-index:3;background-color:#fff;border-right:1px solid #1b4379;transition:width 1s,min-width 1s}#listframe.hd:not(.fix){min-width:0;width:0;overflow:hidden}#sidebar~div{left:2.3rem}body>.timer{position:fixed;bottom:3px;height:1px;border-bottom:2px solid #ff0;transition:width 1s linear;left:0}#oci_login{width:600px} \ No newline at end of file diff --git a/Fuchs/wwwroot/web/tools.js b/Fuchs/wwwroot/web/tools.js index ceb47a5..f36c9c0 100644 --- a/Fuchs/wwwroot/web/tools.js +++ b/Fuchs/wwwroot/web/tools.js @@ -1,4 +1,5 @@ -/*! js-cookie v3.0.1 | MIT */ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self,function(){var n=e.Cookies,o=e.Cookies=t();o.noConflict=function(){return e.Cookies=n,o}}())}(this,(function(){"use strict";function e(e){for(var t=1;t+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="",le.option=!!xe.lastChild;var ke={thead:[1,"
","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n",""]);var je=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="
",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 0 +/// Explains an mfr merge that failed with "String or binary data would be truncated": SQL Server +/// (message 8152, or 2628 below compatibility level 150 / without VERBOSE_TRUNCATION_WARNINGS) +/// does not name the column, and the merge proc copies the staging table into both the +/// mfr__tt__* table type and the mfr__* target. After such a failure the staged +/// is compared against the narrower of the two declared widths, so the +/// error log names the column, the longest value and an entity Id. +/// Runs only on the failure path — no cost for a successful merge. +/// +internal static class FdsColumnWidths +{ + /// One column whose staged values exceed the declared width. + internal sealed record Overflow(string Column, int MaxAllowed, int LongestLength, int RowsOver, object? LongestRowId) + { + public override string ToString() => + string.Create(CultureInfo.InvariantCulture, + $"{Column}: {LongestLength} > {MaxAllowed} chars ({RowsOver} row{(RowsOver == 1 ? "" : "s")}{(LongestRowId is null ? "" : $", e.g. Id={LongestRowId}")})"); + } + + /// 8152 = classic truncation message; 2628 = verbose variant (compat level 150+). + internal static bool IsTruncationError(int sqlErrorNumber) => sqlErrorNumber is 8152 or 2628; + + internal static bool IsTruncationError(Exception? exc) => + exc is Microsoft.Data.SqlClient.SqlException sx && IsTruncationError(sx.Number); + + /// + /// Char width of every bounded string column of the target table and of its + /// mfr__tt__ table type (same naming rule as the mfr__updt__ merge proc); + /// where both declare the column the narrower wins. MAX columns (max_length = -1) are omitted. + /// Expects parameter @tablename. + /// + internal const string WidthsSql = """ + SELECT [columnname] = c.[name], + [maxchars] = MIN(CASE WHEN c.[system_type_id] IN (231, 239) THEN c.[max_length] / 2 ELSE c.[max_length] END) + FROM sys.columns AS c + WHERE c.[system_type_id] IN (167, 175, 231, 239) + AND c.[max_length] > 0 + AND (c.[object_id] = OBJECT_ID(N'[dbo].' + QUOTENAME(@tablename)) + OR c.[object_id] IN (SELECT tt.[type_table_object_id] FROM sys.table_types AS tt + WHERE tt.[schema_id] = SCHEMA_ID(N'dbo') + AND tt.[name] = REPLACE(@tablename, N'__', N'__tt__'))) + GROUP BY c.[name]; + """; + + /// Rows of → column name → max chars (case-insensitive). + internal static Dictionary ToWidthMap(DataTable? widthRows) + { + var map = new Dictionary(StringComparer.OrdinalIgnoreCase); + if (widthRows == null || !widthRows.Columns.Contains("columnname") || !widthRows.Columns.Contains("maxchars")) + return map; + foreach (DataRow row in widthRows.Rows) + { + if (row["columnname"] is not string name || string.IsNullOrWhiteSpace(name)) continue; + if (row["maxchars"] is DBNull) continue; + int width = Convert.ToInt32(row["maxchars"], CultureInfo.InvariantCulture); + if (width <= 0) continue; + map[name] = map.TryGetValue(name, out int existing) ? Math.Min(existing, width) : width; + } + return map; + } + + /// + /// String columns of holding at least one value longer than the + /// declared width, one entry per column with the longest value's length and row Id. + /// Columns without a known width (MAX or not declared) are never reported. + /// + internal static IReadOnlyList FindOverflows(DataTable batch, IReadOnlyDictionary widths) + { + var result = new List(); + if (batch.Rows.Count == 0 || widths.Count == 0) return result; + DataColumn? idColumn = batch.Columns.Contains("Id") ? batch.Columns["Id"] : null; + + foreach (DataColumn col in batch.Columns) + { + if (col.DataType != typeof(string) || !widths.TryGetValue(col.ColumnName, out int maxAllowed)) continue; + int longest = 0, rowsOver = 0; + object? longestId = null; + foreach (DataRow row in batch.Rows) + { + if (row.RowState == DataRowState.Deleted || row[col] is not string s || s.Length <= maxAllowed) continue; + rowsOver++; + if (s.Length > longest) + { + longest = s.Length; + longestId = idColumn != null && row[idColumn] is not DBNull ? row[idColumn] : null; + } + } + if (rowsOver > 0) result.Add(new Overflow(col.ColumnName, maxAllowed, longest, rowsOver, longestId)); + } + return result; + } + + /// Log-friendly summary; "none detected" when the batch fits the declared widths. + internal static string Describe(IReadOnlyList overflows) => + overflows.Count == 0 ? "none detected" : string.Join("; ", overflows); +} diff --git a/Fuchs_DataService/FdsMfrClient.cs b/Fuchs_DataService/FdsMfrClient.cs index 61bcd47..f8b8c50 100644 --- a/Fuchs_DataService/FdsMfrClient.cs +++ b/Fuchs_DataService/FdsMfrClient.cs @@ -294,10 +294,10 @@ public class FdsMfrClient : IDisposable dtwa.CommandAfterError = new SqlCommand( $"DROP TABLE IF EXISTS [{fallbackTable}]; SELECT * INTO [{fallbackTable}] FROM {dtwa.DestinationTableName};") { CommandTimeout = MergeCommandTimeoutSeconds }; - dtwa.OnCommandAfterError += (sender, caex) => - _logger.LogError(caex, - "Update__entitytable: merge into {Table} failed ({Entity}, setid={SetId}, rows={Rows}) — staged batch kept in {FallbackTable}", - tbl.TableName, thisEntityName, setId, trc, fallbackTable); + // Logged after DoSubmit returns so a truncation can be explained + // (column + length + Id) with an awaited width lookup. + Exception? mergeError = null; + dtwa.OnCommandAfterError += (sender, caex) => mergeError = caex; dtwa.OnError += (sender, exc, message) => _logger.LogError(exc, "Update__entitytable: DatatableWriterAsync submission failed for {Table} ({Entity}, setid={SetId}) — {Message}", @@ -319,6 +319,15 @@ public class FdsMfrClient : IDisposable new("@tgtid", entityId.Length > 0 ? entityId[0].ToString() : (object)DBNull.Value) }); dtwa.DoSubmit(); + if (mergeError != null) + { + string overlong = FdsColumnWidths.IsTruncationError(mergeError) + ? await DescribeOverlongColumnsAsync(tbl) + : "n/a"; + _logger.LogError(mergeError, + "Update__entitytable: merge into {Table} failed ({Entity}, setid={SetId}, rows={Rows}) — staged batch kept in {FallbackTable}; over-long columns: {OverlongColumns}", + tbl.TableName, thisEntityName, setId, trc, fallbackTable, overlong); + } } catch (Exception dsex) { @@ -341,6 +350,26 @@ public class FdsMfrClient : IDisposable return true; } + /// + /// Failure path only: names the staged columns wider than the target table / table type allow. + /// Never throws — a failed lookup is reported in the returned text instead. + /// + private async Task DescribeOverlongColumnsAsync(DataTable batch) + { + try + { + var widths = await getSQLDatatable_async(FdsColumnWidths.WidthsSql, FdsShared.FDSConnectionString(), + SqlParameterList: new List { new("@tablename", batch.TableName) }, + options: new FdsSqlOptions(logger: _logger)); + if (!string.IsNullOrEmpty(widths.Exception)) return "column widths unavailable: " + widths.Exception; + return FdsColumnWidths.Describe(FdsColumnWidths.FindOverflows(batch, FdsColumnWidths.ToWidthMap(widths.DataTable))); + } + catch (Exception ex) + { + return "column widths unavailable: " + ex.Message; + } + } + private static void SetRowValue(DataRow row, string key, object value) { if (!row.Table.Columns.Contains(key)) return; diff --git a/Fuchs_DataService/Fuchs_DataService.xml b/Fuchs_DataService/Fuchs_DataService.xml index 21a3f9d..c74a828 100644 --- a/Fuchs_DataService/Fuchs_DataService.xml +++ b/Fuchs_DataService/Fuchs_DataService.xml @@ -4,6 +4,47 @@ Fuchs_DataService + + + Explains an mfr merge that failed with "String or binary data would be truncated": SQL Server + (message 8152, or 2628 below compatibility level 150 / without VERBOSE_TRUNCATION_WARNINGS) + does not name the column, and the merge proc copies the staging table into both the + mfr__tt__* table type and the mfr__* target. After such a failure the staged + is compared against the narrower of the two declared widths, so the + error log names the column, the longest value and an entity Id. + Runs only on the failure path — no cost for a successful merge. + + + + One column whose staged values exceed the declared width. + + + One column whose staged values exceed the declared width. + + + 8152 = classic truncation message; 2628 = verbose variant (compat level 150+). + + + + Char width of every bounded string column of the target table and of its + mfr__tt__ table type (same naming rule as the mfr__updt__ merge proc); + where both declare the column the narrower wins. MAX columns (max_length = -1) are omitted. + Expects parameter @tablename. + + + + Rows of → column name → max chars (case-insensitive). + + + + String columns of holding at least one value longer than the + declared width, one entry per column with the longest value's length and row Id. + Columns without a known width (MAX or not declared) are never reported. + + + + Log-friendly summary; "none detected" when the batch fits the declared widths. + Logs every SQL error through the worker's structured alone — which, when @@ -29,6 +70,12 @@ (empty) shape is loaded. Empty when the entity table itself is unknown. + + + Failure path only: names the staged columns wider than the target table / table type allow. + Never throws — a failed lookup is reported in the returned text instead. + + Holds the application supplied by the host (the Fuchs web app). diff --git a/Fuchs_Database/FuchsDatabase.sqlproj b/Fuchs_Database/FuchsDatabase.sqlproj index e03f136..d2332d1 100644 --- a/Fuchs_Database/FuchsDatabase.sqlproj +++ b/Fuchs_Database/FuchsDatabase.sqlproj @@ -22,7 +22,11 @@ False True True - 71501 + + 71501;71558 + True bin\Release\ @@ -148,6 +152,7 @@ + @@ -205,6 +210,10 @@ + + + + @@ -411,5 +420,16 @@ + + - \ No newline at end of file + + + + $(DacPacRootPath)\Extensions\Microsoft\SQLDB\Extensions\SqlServer\170\SQLSchemas\master.dacpac + False + master + + + diff --git a/Fuchs_Database/Scripts/2026-09-30_backfill_intermediate_invoice_allocations.sql b/Fuchs_Database/Scripts/2026-09-30_backfill_intermediate_invoice_allocations.sql new file mode 100644 index 0000000..f128d56 --- /dev/null +++ b/Fuchs_Database/Scripts/2026-09-30_backfill_intermediate_invoice_allocations.sql @@ -0,0 +1,92 @@ +-- ============================================= +-- One-off data backfill — run once per environment AFTER deploying the schema that carries +-- reference_InvId through fds__prepInvoice / the editor and fixes the allocation MERGE in +-- fds__setInvoiceFinal (2026-09-30). +-- +-- Until then fds__invoice_items.reference_InvId was never written for 'IntInvoiceAllocation' lines +-- ("Anrechnung der Abschlagsrechnung R2025-0244 …"), so +-- * fds__setInvoiceFinal's allocation MERGE failed with 515 (NULL into fds__invoice_details.InvId) +-- for every Schlussrechnung — logged, invoice finalized anyway, allocation never recorded; +-- * fds__invoice_details.AllocatedTo_InvId stayed NULL for every Abschlagsrechnung, so +-- fds__prepInvoice would offer an already credited Abschlagsrechnung again. +-- This script +-- 1. restores reference_InvId from the invoice number in the line text (only unique matches), and +-- 2. records AllocatedTo_InvId for each Abschlagsrechnung that is credited on a finalized, +-- non-cancelled invoice (earliest such invoice wins; nothing already allocated is overwritten). +-- Default is a dry run (@apply = 0) that only reports; set @apply = 1 to write. +-- Idempotent: only rows with an empty reference / allocation are touched. +-- ============================================= +SET NOCOUNT ON; +SET XACT_ABORT ON; + +DECLARE @apply bit = 0; -- 1 = write changes + +IF OBJECT_ID('tempdb..#alloc') IS NOT NULL DROP TABLE #alloc; + +WITH lines AS ( + SELECT it.[Id], it.[InvId], + [num] = SUBSTRING(it.[Text], PATINDEX('%R[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]%', it.[Text]), 10) + FROM [dbo].[fds__invoice_items] AS it + WHERE it.[Type] = 'IntInvoiceAllocation' + AND ISNULL(it.[reference_InvId], '') = '' + AND PATINDEX('%R[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]%', it.[Text]) > 0 +), matched AS ( + SELECT l.[Id], l.[InvId], l.[num], + [RefInvId] = MIN(i.[Id]), [cand] = COUNT(i.[Id]) + FROM lines AS l + LEFT JOIN [dbo].[fds__invoices] AS i ON i.[InvoiceId] = l.[num] AND i.[InvoiceType] = 'i' + GROUP BY l.[Id], l.[InvId], l.[num] +) +SELECT [ItemId] = [Id], [TgtInvId] = [InvId], [num], [RefInvId], [cand] +INTO #alloc +FROM matched; + +SELECT [lines_without_reference] = COUNT(*), + [unique_match] = SUM(IIF([cand] = 1, 1, 0)), + [no_match] = SUM(IIF([cand] = 0, 1, 0)), + [ambiguous] = SUM(IIF([cand] > 1, 1, 0)) +FROM #alloc; + +-- Abschlagsrechnungen credited on more than one finalized, non-cancelled invoice (review manually) +SELECT a.[num], a.[RefInvId], [credited_on] = t.[InvoiceId], t.[DateFinalized], t.[InvoiceType] +FROM #alloc AS a + JOIN [dbo].[fds__invoices] AS t ON t.[Id] = a.[TgtInvId] AND t.[isFinal] = 1 AND ISNULL(t.[IsCanceled], 0) = 0 +WHERE a.[cand] = 1 + AND a.[RefInvId] IN (SELECT a2.[RefInvId] FROM #alloc AS a2 + JOIN [dbo].[fds__invoices] AS t2 ON t2.[Id] = a2.[TgtInvId] AND t2.[isFinal] = 1 AND ISNULL(t2.[IsCanceled], 0) = 0 + WHERE a2.[cand] = 1 + GROUP BY a2.[RefInvId] HAVING COUNT(DISTINCT a2.[TgtInvId]) > 1) +ORDER BY a.[num], t.[DateFinalized]; + +IF @apply = 1 +BEGIN + BEGIN TRANSACTION; + + UPDATE it + SET it.[reference_InvId] = a.[RefInvId] + FROM [dbo].[fds__invoice_items] AS it + JOIN #alloc AS a ON a.[ItemId] = it.[Id] AND a.[cand] = 1 + WHERE ISNULL(it.[reference_InvId], '') = ''; + PRINT CONCAT('invoice item references restored: ', @@ROWCOUNT); + + WITH firstTarget AS ( + SELECT a.[RefInvId], a.[TgtInvId], + [rn] = ROW_NUMBER() OVER (PARTITION BY a.[RefInvId] ORDER BY t.[DateFinalized], t.[Id]) + FROM #alloc AS a + JOIN [dbo].[fds__invoices] AS t ON t.[Id] = a.[TgtInvId] AND t.[isFinal] = 1 AND ISNULL(t.[IsCanceled], 0) = 0 + WHERE a.[cand] = 1 + ) + MERGE [dbo].[fds__invoice_details] AS TARGET + USING (SELECT [RefInvId], [TgtInvId] FROM firstTarget WHERE [rn] = 1) AS src ON TARGET.[InvId] = src.[RefInvId] + WHEN MATCHED AND ISNULL(TARGET.[AllocatedTo_InvId], '') = '' THEN + UPDATE SET [AllocatedTo_InvId] = src.[TgtInvId] + WHEN NOT MATCHED BY TARGET THEN + INSERT ([InvId], [AllocatedTo_InvId]) VALUES (src.[RefInvId], src.[TgtInvId]); + PRINT CONCAT('Abschlagsrechnung allocations recorded: ', @@ROWCOUNT); + + COMMIT TRANSACTION; +END +ELSE + PRINT 'Dry run only — set @apply = 1 to write.'; + +DROP TABLE #alloc; diff --git a/Fuchs_Database/Scripts/2026-09-30_mfr_truncation_fix.sql b/Fuchs_Database/Scripts/2026-09-30_mfr_truncation_fix.sql new file mode 100644 index 0000000..50eb201 --- /dev/null +++ b/Fuchs_Database/Scripts/2026-09-30_mfr_truncation_fix.sql @@ -0,0 +1,504 @@ +-- ============================================= +-- 2026-09-30 mfr sync: "String or binary data would be truncated" (msg 8152) +-- +-- Root cause: mfr's free-text [Note] on ServiceObject and Company has no length limit +-- (live mfr data on 2026-09-30: ServiceObject.Note up to 753 chars, Company.Note up to 723), +-- but [mfr__serviceobjects].[Note], [mfr__companies].[Note] and their table types +-- [mfr__tt__serviceobjects] / [mfr__tt__companies] were NVARCHAR(255). The merge procs +-- [mfr__updt__serviceobjects] / [mfr__updt__companies] copy the staging table into the type, +-- so every batch containing such a row (the entity's own sync and every Company/Contact/ +-- ServiceRequest/ServiceObject sync that $expands it) was rejected as a whole. +-- +-- This script (idempotent, safe to re-run; one transaction, all-or-nothing): +-- 1. patches the [@company] table variable in fds__getRequest_details, fds__prepInvoice +-- and fds__prepStorno_recreate (they INSERT ... SELECT cy.* from [mfr__companies]): +-- [Note] -> nvarchar(max) (without this, widening the table would move the truncation +-- into invoice/request preparation for customers with a long note), and +-- [CustomValues] / [MainContactId] -> NULL (both nullable in [mfr__companies]; the +-- NOT NULL declaration raised 515 for a company without main contact). Patched IN +-- PLACE on the deployed definition (only the @company block changes), so other edits +-- to those procs already deployed on this server are kept. Same result as the SSDT +-- versions of these procs. +-- 2. ALTERs [mfr__serviceobjects].[Note] and [mfr__companies].[Note] to NVARCHAR(MAX). +-- 3. Drops/recreates the table types [mfr__tt__serviceobjects] / [mfr__tt__companies] +-- (a table type cannot be ALTERed). The procs that DECLARE them, +-- [mfr__updt__serviceobjects] / [mfr__updt__companies], are dropped first and recreated +-- from the SSDT source; explicit GRANT/DENY on proc and type are captured and re-applied. +-- 4. Queues a re-sync (fds__mfr_updaterequests) for the rows that were rejected, because +-- the short sync only fetches rows newer than the local watermark and would skip them. +-- +-- Recommended: stop the Fuchs_DataService worker while the script runs. +-- Matches SSDT (Fuchs_Database) as of 2026-09-30. +-- ============================================= +SET NOCOUNT ON; +SET XACT_ABORT ON; +SET QUOTED_IDENTIFIER ON; +SET ANSI_NULLS ON; + +DECLARE @type_so nvarchar(max) = N'CREATE TYPE [dbo].[mfr__tt__serviceobjects] AS TABLE ( + [setid] VARCHAR (5) NULL, + [Id] BIGINT NOT NULL, + [Location#ID] BIGINT NULL, + [Name] NVARCHAR (255) NULL, + [Note] NVARCHAR (MAX) NULL, + [CustomValues] NVARCHAR (MAX) NOT NULL, + [DateModified] DATETIME NOT NULL, + [ExternalId] NVARCHAR (255) NULL, + [MappingId] NVARCHAR (255) NULL, + [QuickSearch] NVARCHAR (255) NULL, + [Version] INT NOT NULL, + [CreateGeoLocation] BIT NOT NULL, + [IsWarehouse] BIT NOT NULL, + [ParentServiceObjectId] BIGINT NOT NULL, + [CompanyId] BIGINT NOT NULL, + [ProductId] BIGINT NOT NULL);'; + +DECLARE @proc_so nvarchar(max) = N'-- ============================================= +-- Author: +-- Create date: +-- Description: +-- ============================================= +CREATE PROCEDURE [dbo].[mfr__updt__serviceobjects] + @tblname as nvarchar(50) + , @referencetable nvarchar(50) + , @tgtid bigint +AS +BEGIN + SET NOCOUNT ON; + SET XACT_ABORT ON; + + BEGIN TRY + + DECLARE @now datetime = GETUTCDATE(); + DECLARE @tmp [dbo].[mfr__tt__serviceobjects]; + + DECLARE @tmp_cmd nvarchar(1000) = N''SELECT DISTINCT * FROM '' + @tblname + INSERT INTO @tmp EXECUTE [sp_executesql] @tmp_cmd; + + BEGIN TRANSACTION; + + IF @referencetable = ''mfr__serviceobjects'' + BEGIN + DELETE p + --OUTput deleted.*, @now INTO [dbo].[mfr__d_*PartnerSet] + FROM [dbo].[mfr__*PartnerSet] as p + WHERE p.Property like ''ServiceObject[:]%'' AND EXISTS (SELECT * FROM @tmp as tmp where tmp.[id] = p.[EntityId]); + DELETE cv + --OUTput deleted.*, @now INTO [dbo].[mfr__d_#customvalues] + FROM [dbo].[mfr__#customvalues] as cv + WHERE cv.Property like ''ServiceObject[:]%'' AND EXISTS (SELECT * FROM @tmp as tmp where tmp.[id] = cv.[EntityId]); + DELETE lc + --OUTPUT deleted.*, @now INTO [dbo].[mfr__d_#locations] + FROM [dbo].[mfr__#locations] as lc + WHERE lc.Property like ''ServiceObject[:]%'' AND EXISTS (SELECT * FROM @tmp as tmp where tmp.[id] = lc.[EntityId]); + DELETE itm + --OUTPUT deleted.*, @now INTO [dbo].[mfr__d_items] + FROM [dbo].[mfr__items] as itm + WHERE EXISTS (SELECT * FROM @tmp as tmp where tmp.[id] = itm.[ServiceObjectId] and ISNULL(itm.[ServiceRequestId],0) = 0); + END + + + MERGE [dbo].[mfr__serviceobjects] as TARGET + USING @tmp as SOURCE ON TARGET.[Id] = SOURCE.[Id] + WHEN MATCHED AND (TARGET.[Version] <= SOURCE.[Version] OR TARGET.[DateModified] <= SOURCE.[DateModified]) THEN + UPDATE + SET [Id] = SOURCE.[Id] + ,[Location#ID] = SOURCE.[Location#ID] + ,[Name] = SOURCE.[Name] + ,[Note] = SOURCE.[Note] + ,[CustomValues] = SOURCE.[CustomValues] + ,[DateModified] = SOURCE.[DateModified] + ,[ExternalId] = SOURCE.[ExternalId] + ,[MappingId] = SOURCE.[MappingId] + ,[QuickSearch] = SOURCE.[QuickSearch] + ,[Version] = SOURCE.[Version] + ,[CreateGeoLocation] = SOURCE.[CreateGeoLocation] + ,[IsWarehouse] = SOURCE.[IsWarehouse] + ,[ParentServiceObjectId] = SOURCE.[ParentServiceObjectId] + ,[CompanyId] = SOURCE.[CompanyId] + ,[ProductId] = SOURCE.[ProductId] + WHEN NOT MATCHED BY TARGET THEN + INSERT + ( [Id] + ,[Location#ID] + ,[Name] + ,[Note] + ,[CustomValues] + ,[DateModified] + ,[ExternalId] + ,[MappingId] + ,[QuickSearch] + ,[Version] + ,[CreateGeoLocation] + ,[IsWarehouse] + ,[ParentServiceObjectId] + ,[CompanyId] + ,[ProductId]) + VALUES + (SOURCE.[Id] + ,SOURCE.[Location#ID] + ,SOURCE.[Name] + ,SOURCE.[Note] + ,SOURCE.[CustomValues] + ,SOURCE.[DateModified] + ,SOURCE.[ExternalId] + ,SOURCE.[MappingId] + ,SOURCE.[QuickSearch] + ,SOURCE.[Version] + ,SOURCE.[CreateGeoLocation] + ,SOURCE.[IsWarehouse] + ,SOURCE.[ParentServiceObjectId] + ,SOURCE.[CompanyId] + ,SOURCE.[ProductId]); + + COMMIT TRANSACTION; + END TRY + BEGIN CATCH + IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION; + + INSERT INTO dbo.[fds__admin_dberrors] ([UserName], [ErrorNumber], [ErrorState], [ErrorSeverity], [ErrorLine], [ErrorProcedure], [ErrorMessage], [ErrorDateTime]) + VALUES (SUSER_SNAME(), ERROR_NUMBER(), ERROR_STATE(), ERROR_SEVERITY(), ERROR_LINE(), ERROR_PROCEDURE(), ERROR_MESSAGE(), GETDATE()); + + THROW; + END CATCH; +END'; + +DECLARE @type_co nvarchar(max) = N'CREATE TYPE [dbo].[mfr__tt__companies] AS TABLE ( + [setid] VARCHAR (5) NULL, + [Id] BIGINT NOT NULL, + [Location#ID] BIGINT NULL, + [Version] INT NOT NULL, + [IsPhysicalPerson] BIT NOT NULL, + [IsOwner] BIT NOT NULL, + [IsEmailInvoicingActive] BIT NOT NULL, + [IsSupplier] BIT NOT NULL, + [MappingId] NVARCHAR (255) NULL, + [ExternalId] NVARCHAR (255) NULL, + [Name] NVARCHAR (255) NULL, + [Note] NVARCHAR (MAX) NULL, + [SupportTelephone] NVARCHAR (255) NULL, + [SupportFax] NVARCHAR (255) NULL, + [SupportMail] NVARCHAR (255) NULL, + [QuickSearch] NVARCHAR (255) NULL, + [DateModified] DATETIME NOT NULL, + [CustomValues] NVARCHAR (MAX) NULL, + [MainContactId] BIGINT NULL);'; + +DECLARE @proc_co nvarchar(max) = N'-- ============================================= +-- Description: mfr sync — merges one staged batch of Company entities into [mfr__companies]. +-- @tblname is the bulk-copied staging table (same layout as [mfr__tt__companies]); +-- [setid] is the batch marker. A full entity reset (@referencetable = ''mfr__companies'') +-- first drops the company''s dependent partner/custom-value/location/comment rows so +-- they are rebuilt from the same batch. Duplicate Ids within one batch (paged reads +-- overlapping a concurrent mfr edit) are collapsed to the highest Version before the +-- MERGE, otherwise MERGE raises 8672. +-- ============================================= +CREATE PROCEDURE [dbo].[mfr__updt__companies] + @tblname as nvarchar(50) + , @referencetable nvarchar(50) + , @tgtid bigint +AS +BEGIN + SET NOCOUNT ON; + SET XACT_ABORT ON; + + BEGIN TRY + + DECLARE @tmp [dbo].[mfr__tt__companies]; + + DECLARE @tmp_cmd nvarchar(1000) = N''SELECT DISTINCT * FROM '' + @tblname + INSERT INTO @tmp EXECUTE [sp_executesql] @tmp_cmd; + + -- Wrapping the DELETEs + MERGE below in one transaction gives all-or-nothing atomicity for + -- this entity''s sync batch (same pattern in every mfr__updt__* proc). During a large full + -- reset this can hold locks on the affected tables for as long as the batch takes to run — + -- an accepted, documented risk, not an oversight. See + -- Docs/Decisions/0022-mfr-sync-transaction-blocking-accepted-risk.md before changing this. + BEGIN TRANSACTION; + + IF @referencetable = ''mfr__companies'' + BEGIN + DELETE p + --OUTput deleted.*, @now INTO [dbo].[mfr__d_*PartnerSet] + FROM [dbo].[mfr__*PartnerSet] as p + WHERE p.Property like ''Company[:]%'' AND EXISTS (SELECT * FROM @tmp as tmp where tmp.[id] = p.[EntityId]); + DELETE cv + --OUTput deleted.*, @now INTO [dbo].[mfr__d_#customvalues] + FROM [dbo].[mfr__#customvalues] as cv + WHERE cv.Property like ''Company[:]%'' AND EXISTS (SELECT * FROM @tmp as tmp where tmp.[id] = cv.[EntityId]); + DELETE lc + --OUTPUT deleted.*, @now INTO [dbo].[mfr__d_#locations] + FROM [dbo].[mfr__#locations] as lc + WHERE lc.Property like ''Company[:]%'' AND EXISTS (SELECT * FROM @tmp as tmp where tmp.[id] = lc.[EntityId]); + DELETE cm + --OUTPUT deleted.*, @now INTO [dbo].[mfr__d_comments] + FROM [dbo].[mfr__comments] as cm + WHERE EXISTS (SELECT * FROM @tmp as tmp where tmp.[id] = cm.[CompanyId] AND ISNULL(cm.[ServiceRequestId],0) = 0); + END; + + WITH tmp as ( + SELECT *, ROW_NUMBER() OVER (PARTITION BY [Id] ORDER BY [Version] DESC, [DateModified] DESC) as ''#'' FROM @tmp + ), SOURCE as ( + SELECT * FROM tmp WHERE [#] = 1 + ) + MERGE [dbo].[mfr__companies] as TARGET + USING SOURCE ON TARGET.[Id] = SOURCE.[Id] + WHEN MATCHED AND (TARGET.[Version] <= SOURCE.[Version] OR TARGET.[DateModified] <= SOURCE.[DateModified]) THEN + UPDATE + SET [Id] = SOURCE.[Id] + ,[Location#ID] = SOURCE.[Location#ID] + ,[Version] = SOURCE.[Version] + ,[IsPhysicalPerson] = SOURCE.[IsPhysicalPerson] + ,[IsOwner] = SOURCE.[IsOwner] + ,[IsEmailInvoicingActive] = SOURCE.[IsEmailInvoicingActive] + ,[IsSupplier] = SOURCE.[IsSupplier] + ,[MappingId] = SOURCE.[MappingId] + ,[ExternalId] = SOURCE.[ExternalId] + ,[Name] = SOURCE.[Name] + ,[Note] = SOURCE.[Note] + ,[SupportTelephone] = SOURCE.[SupportTelephone] + ,[SupportFax] = SOURCE.[SupportFax] + ,[SupportMail] = SOURCE.[SupportMail] + ,[QuickSearch] = SOURCE.[QuickSearch] + ,[DateModified] = SOURCE.[DateModified] + ,[CustomValues] = SOURCE.[CustomValues] + ,[MainContactId] = SOURCE.[MainContactId] + WHEN NOT MATCHED BY TARGET THEN + INSERT + ( [Id] + ,[Location#ID] + ,[Version] + ,[IsPhysicalPerson] + ,[IsOwner] + ,[IsEmailInvoicingActive] + ,[IsSupplier] + ,[MappingId] + ,[ExternalId] + ,[Name] + ,[Note] + ,[SupportTelephone] + ,[SupportFax] + ,[SupportMail] + ,[QuickSearch] + ,[DateModified] + ,[CustomValues] + ,[MainContactId]) + VALUES + (SOURCE.[Id] + ,SOURCE.[Location#ID] + ,SOURCE.[Version] + ,SOURCE.[IsPhysicalPerson] + ,SOURCE.[IsOwner] + ,SOURCE.[IsEmailInvoicingActive] + ,SOURCE.[IsSupplier] + ,SOURCE.[MappingId] + ,SOURCE.[ExternalId] + ,SOURCE.[Name] + ,SOURCE.[Note] + ,SOURCE.[SupportTelephone] + ,SOURCE.[SupportFax] + ,SOURCE.[SupportMail] + ,SOURCE.[QuickSearch] + ,SOURCE.[DateModified] + ,SOURCE.[CustomValues] + ,SOURCE.[MainContactId]); + + COMMIT TRANSACTION; + END TRY + BEGIN CATCH + IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION; + + INSERT INTO dbo.[fds__admin_dberrors] ([UserName], [ErrorNumber], [ErrorState], [ErrorSeverity], [ErrorLine], [ErrorProcedure], [ErrorMessage], [ErrorDateTime]) + VALUES (SUSER_SNAME(), ERROR_NUMBER(), ERROR_STATE(), ERROR_SEVERITY(), ERROR_LINE(), ERROR_PROCEDURE(), ERROR_MESSAGE(), GETDATE()); + + THROW; + END CATCH; +END'; + +DECLARE @perms TABLE ([stmt] nvarchar(max) NOT NULL); +DECLARE @stmt nvarchar(max); + +BEGIN TRY + BEGIN TRANSACTION; + + -- ---- 1. the [@company] table variable in the invoice/request preparation procs + -- Three column changes, matching the SSDT versions of these procs: + -- [Note] nvarchar(255) -> nvarchar(max) (this fix) + -- [CustomValues] NOT NULL -> NULL (nullable in [mfr__companies]; NOT NULL here + -- [MainContactId] NOT NULL -> NULL raised 515 on INSERT ... SELECT cy.* for a + -- company without main contact / custom values) + -- Only the "DECLARE @company TABLE ( ... );" block is edited: the same column names occur in other + -- table variables of these procs (e.g. @SReq.[CustomValues] NOT NULL), which must stay as they are. + DECLARE @procname sysname, @def nvarchar(max), @pos int, @i int, @blkStart int, @blkEnd int, @blk nvarchar(max), @blkNew nvarchar(max); + DECLARE @blkMarker nvarchar(50) = N'DECLARE @company TABLE'; + DECLARE proc_cur CURSOR LOCAL FAST_FORWARD FOR + SELECT v.[name] FROM (VALUES (N'fds__getRequest_details'), (N'fds__prepInvoice'), (N'fds__prepStorno_recreate')) AS v([name]); + OPEN proc_cur; + FETCH NEXT FROM proc_cur INTO @procname; + WHILE @@FETCH_STATUS = 0 + BEGIN + SET @def = OBJECT_DEFINITION(OBJECT_ID(N'[dbo].' + QUOTENAME(@procname))); + -- Locate the CREATE keyword of "CREATE PROCEDURE" (deployed headers vary in spacing). + SET @pos = CHARINDEX(N'PROCEDURE', ISNULL(@def, N'')); + SET @i = @pos - 1; + WHILE @i > 0 AND SUBSTRING(@def, @i, 1) IN (N' ', NCHAR(9), NCHAR(10), NCHAR(13)) SET @i -= 1; + SET @pos = CASE WHEN @pos > 0 AND @i >= 6 AND SUBSTRING(@def, @i - 5, 6) = N'CREATE' THEN @i - 5 ELSE 0 END; + -- Locate the single "DECLARE @company TABLE ( ... );" block (ends at the first ');' after the marker). + SET @blkStart = CHARINDEX(@blkMarker, ISNULL(@def, N'')); + SET @blkEnd = CASE WHEN @blkStart > 0 THEN CHARINDEX(N');', @def, @blkStart) ELSE 0 END; + IF @def IS NULL + RAISERROR(N'WARNING: [dbo].[%s] not found - skipped.', 10, 1, @procname) WITH NOWAIT; + ELSE IF @pos = 0 OR @blkStart = 0 OR @blkEnd = 0 OR CHARINDEX(@blkMarker, @def, @blkStart + 1) > 0 + RAISERROR(N'WARNING: [dbo].[%s] could not be patched automatically (no CREATE PROCEDURE header, or the @company TABLE block is missing/ambiguous) - edit its @company declaration by hand: [Note] nvarchar(max), [CustomValues] NULL, [MainContactId] NULL.', 10, 1, @procname) WITH NOWAIT; + ELSE + BEGIN + SET @blk = SUBSTRING(@def, @blkStart, @blkEnd - @blkStart + 2); + SET @blkNew = REPLACE(@blk, N'[Note] [nvarchar](255) NULL', N'[Note] [nvarchar](max) NULL'); + SET @blkNew = REPLACE(@blkNew, N'[CustomValues] [nvarchar](max) NOT NULL', N'[CustomValues] [nvarchar](max) NULL'); + SET @blkNew = REPLACE(@blkNew, N'[MainContactId] [bigint] NOT NULL', N'[MainContactId] [bigint] NULL'); + IF @blkNew = @blk + PRINT CONCAT(N'[', @procname, N'] @company block already matches SSDT - skipped.'); + ELSE + BEGIN + -- block first (it lies after the header), then CREATE -> ALTER (changes the length before it) + SET @def = STUFF(@def, @blkStart, DATALENGTH(@blk) / 2, @blkNew); + SET @def = STUFF(@def, @pos, LEN(N'CREATE'), N'ALTER'); + EXEC (@def); + PRINT CONCAT(N'[', @procname, N'] @company block patched: [Note] nvarchar(max), [CustomValues] NULL, [MainContactId] NULL.'); + END + END + FETCH NEXT FROM proc_cur INTO @procname; + END + CLOSE proc_cur; + DEALLOCATE proc_cur; + + -- ---- 2. target tables + IF EXISTS (SELECT * FROM sys.columns WHERE [object_id] = OBJECT_ID(N'[dbo].[mfr__serviceobjects]') AND [name] = N'Note' AND [max_length] <> -1) + BEGIN + ALTER TABLE [dbo].[mfr__serviceobjects] ALTER COLUMN [Note] NVARCHAR (MAX) NULL; + PRINT N'[mfr__serviceobjects].[Note] widened to NVARCHAR(MAX).'; + END + ELSE PRINT N'[mfr__serviceobjects].[Note] already NVARCHAR(MAX) - skipped.'; + + IF EXISTS (SELECT * FROM sys.columns WHERE [object_id] = OBJECT_ID(N'[dbo].[mfr__companies]') AND [name] = N'Note' AND [max_length] <> -1) + BEGIN + ALTER TABLE [dbo].[mfr__companies] ALTER COLUMN [Note] NVARCHAR (MAX) NULL; + PRINT N'[mfr__companies].[Note] widened to NVARCHAR(MAX).'; + END + ELSE PRINT N'[mfr__companies].[Note] already NVARCHAR(MAX) - skipped.'; + + -- ---- 3. table types (+ the merge procs that declare them) + + -- ---- [mfr__tt__serviceobjects] + [mfr__updt__serviceobjects] + IF EXISTS (SELECT * FROM sys.table_types AS tt JOIN sys.columns AS c ON c.[object_id] = tt.[type_table_object_id] + WHERE tt.[schema_id] = SCHEMA_ID(N'dbo') AND tt.[name] = N'mfr__tt__serviceobjects' AND c.[name] = N'Note' AND c.[max_length] <> -1) + BEGIN + -- A table type cannot be ALTERed. [mfr__updt__serviceobjects] DECLAREs it, so the proc is dropped + -- first and recreated from the SSDT source afterwards; explicit grants are re-applied. + INSERT INTO @perms ([stmt]) + SELECT CONCAT(CASE p.[state] WHEN 'D' THEN N'DENY ' ELSE N'GRANT ' END, p.[permission_name], + CASE p.[class] WHEN 1 THEN N' ON OBJECT::[dbo].' + QUOTENAME(o.[name]) ELSE N' ON TYPE::[dbo].' + QUOTENAME(t.[name]) END, + N' TO ', QUOTENAME(USER_NAME(p.[grantee_principal_id])), + CASE p.[state] WHEN 'W' THEN N' WITH GRANT OPTION' ELSE N'' END, N';') + FROM sys.database_permissions AS p + LEFT JOIN sys.objects AS o ON p.[class] = 1 AND o.[object_id] = p.[major_id] + LEFT JOIN sys.types AS t ON p.[class] = 6 AND t.[user_type_id] = p.[major_id] + WHERE (p.[class] = 1 AND o.[object_id] = OBJECT_ID(N'[dbo].[mfr__updt__serviceobjects]')) + OR (p.[class] = 6 AND t.[name] = N'mfr__tt__serviceobjects' AND t.[schema_id] = SCHEMA_ID(N'dbo')); + + IF OBJECT_ID(N'[dbo].[mfr__updt__serviceobjects]', N'P') IS NOT NULL DROP PROCEDURE [dbo].[mfr__updt__serviceobjects]; + DROP TYPE [dbo].[mfr__tt__serviceobjects]; + EXEC (@type_so); + EXEC (@proc_so); + PRINT N'[mfr__tt__serviceobjects] recreated with [Note] NVARCHAR(MAX); [mfr__updt__serviceobjects] recreated.'; + END + ELSE PRINT N'[mfr__tt__serviceobjects].[Note] already NVARCHAR(MAX) - skipped.'; + + -- ---- [mfr__tt__companies] + [mfr__updt__companies] + IF EXISTS (SELECT * FROM sys.table_types AS tt JOIN sys.columns AS c ON c.[object_id] = tt.[type_table_object_id] + WHERE tt.[schema_id] = SCHEMA_ID(N'dbo') AND tt.[name] = N'mfr__tt__companies' AND c.[name] = N'Note' AND c.[max_length] <> -1) + BEGIN + -- A table type cannot be ALTERed. [mfr__updt__companies] DECLAREs it, so the proc is dropped + -- first and recreated from the SSDT source afterwards; explicit grants are re-applied. + INSERT INTO @perms ([stmt]) + SELECT CONCAT(CASE p.[state] WHEN 'D' THEN N'DENY ' ELSE N'GRANT ' END, p.[permission_name], + CASE p.[class] WHEN 1 THEN N' ON OBJECT::[dbo].' + QUOTENAME(o.[name]) ELSE N' ON TYPE::[dbo].' + QUOTENAME(t.[name]) END, + N' TO ', QUOTENAME(USER_NAME(p.[grantee_principal_id])), + CASE p.[state] WHEN 'W' THEN N' WITH GRANT OPTION' ELSE N'' END, N';') + FROM sys.database_permissions AS p + LEFT JOIN sys.objects AS o ON p.[class] = 1 AND o.[object_id] = p.[major_id] + LEFT JOIN sys.types AS t ON p.[class] = 6 AND t.[user_type_id] = p.[major_id] + WHERE (p.[class] = 1 AND o.[object_id] = OBJECT_ID(N'[dbo].[mfr__updt__companies]')) + OR (p.[class] = 6 AND t.[name] = N'mfr__tt__companies' AND t.[schema_id] = SCHEMA_ID(N'dbo')); + + IF OBJECT_ID(N'[dbo].[mfr__updt__companies]', N'P') IS NOT NULL DROP PROCEDURE [dbo].[mfr__updt__companies]; + DROP TYPE [dbo].[mfr__tt__companies]; + EXEC (@type_co); + EXEC (@proc_co); + PRINT N'[mfr__tt__companies] recreated with [Note] NVARCHAR(MAX); [mfr__updt__companies] recreated.'; + END + ELSE PRINT N'[mfr__tt__companies].[Note] already NVARCHAR(MAX) - skipped.'; + + DECLARE perm_cur CURSOR LOCAL FAST_FORWARD FOR SELECT [stmt] FROM @perms; + OPEN perm_cur; + FETCH NEXT FROM perm_cur INTO @stmt; + WHILE @@FETCH_STATUS = 0 + BEGIN + EXEC (@stmt); + PRINT N'Re-applied: ' + @stmt; + FETCH NEXT FROM perm_cur INTO @stmt; + END + CLOSE perm_cur; + DEALLOCATE perm_cur; + + -- ---- 4. queue a re-sync of the rejected rows + -- Rows with a >255-char Note in mfr on 2026-09-30 (read-only scan of the mfr OData API). + DECLARE @resync TABLE ([entity_name] varchar(255) NOT NULL, [Id] bigint NOT NULL); + INSERT INTO @resync ([entity_name], [Id]) VALUES + ('ServiceObject', 24296783880), ('ServiceObject', 34080915468), ('ServiceObject', 38722404355) + ,('ServiceObject', 105289089024), ('ServiceObject', 105292464132), ('ServiceObject', 105292464134) + ,('Company', 104430043136), ('Company', 105288990720); + -- Plus every row of the last rejected batch kept by the data service (if present). + IF OBJECT_ID(N'[dbo].[t_err_mfr__serviceobjects]', N'U') IS NOT NULL + INSERT INTO @resync EXEC (N'SELECT DISTINCT ''ServiceObject'', CAST([Id] AS bigint) FROM [dbo].[t_err_mfr__serviceobjects] WHERE [Id] IS NOT NULL;'); + IF OBJECT_ID(N'[dbo].[t_err_mfr__companies]', N'U') IS NOT NULL + INSERT INTO @resync EXEC (N'SELECT DISTINCT ''Company'', CAST([Id] AS bigint) FROM [dbo].[t_err_mfr__companies] WHERE [Id] IS NOT NULL;'); + + INSERT INTO [dbo].[fds__mfr_updaterequests] ([entity_name], [Id]) + SELECT DISTINCT r.[entity_name], r.[Id] FROM @resync AS r + WHERE NOT EXISTS (SELECT * FROM [dbo].[fds__mfr_updaterequests] AS q + WHERE q.[entity_name] = r.[entity_name] AND q.[Id] = r.[Id]); + PRINT CONCAT(N'Re-sync requests queued: ', @@ROWCOUNT); + + COMMIT TRANSACTION; + PRINT N'mfr truncation fix applied.'; +END TRY +BEGIN CATCH + IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION; + THROW; +END CATCH; +GO + +-- ---- verification +-- Expect max_length = -1 on all four rows. +SELECT [object] = o.[name], [column] = c.[name], c.[max_length] + FROM sys.columns AS c JOIN sys.objects AS o ON o.[object_id] = c.[object_id] + WHERE c.[name] = N'Note' AND o.[name] IN (N'mfr__serviceobjects', N'mfr__companies') +UNION ALL +SELECT tt.[name], c.[name], c.[max_length] + FROM sys.table_types AS tt JOIN sys.columns AS c ON c.[object_id] = tt.[type_table_object_id] + WHERE c.[name] = N'Note' AND tt.[name] IN (N'mfr__tt__serviceobjects', N'mfr__tt__companies'); +-- Expect no row (every @company block widened and made nullable; other table variables are not inspected). +SELECT [still_unpatched] = o.[name], [company_block] = b.[blk] + FROM sys.sql_modules AS m JOIN sys.objects AS o ON o.[object_id] = m.[object_id] + CROSS APPLY (SELECT [s] = CHARINDEX(N'DECLARE @company TABLE', m.[definition])) AS p + CROSS APPLY (SELECT [blk] = CASE WHEN p.[s] > 0 THEN SUBSTRING(m.[definition], p.[s], CHARINDEX(N');', m.[definition], p.[s]) - p.[s] + 2) ELSE N'' END) AS b + WHERE o.[name] IN (N'fds__getRequest_details', N'fds__prepInvoice', N'fds__prepStorno_recreate') + AND (b.[blk] LIKE N'%[[]Note] [[]nvarchar](255)%' + OR b.[blk] LIKE N'%[[]CustomValues] [[]nvarchar](max) NOT NULL%' + OR b.[blk] LIKE N'%[[]MainContactId] [[]bigint] NOT NULL%' + OR p.[s] = 0); +-- Once the worker has run, the queue drains and the counts approach mfr's +-- (2026-09-30: 5531 ServiceObjects, 4625 Companies). +SELECT [queued] = COUNT(*) FROM [dbo].[fds__mfr_updaterequests] WHERE [entity_name] IN ('ServiceObject', 'Company'); +SELECT [serviceobjects] = (SELECT COUNT(*) FROM [dbo].[mfr__serviceobjects]), [companies] = (SELECT COUNT(*) FROM [dbo].[mfr__companies]); diff --git a/Fuchs_Database/Security/Logins.sql b/Fuchs_Database/Security/Logins.sql new file mode 100644 index 0000000..e7521a2 --- /dev/null +++ b/Fuchs_Database/Security/Logins.sql @@ -0,0 +1,12 @@ +-- Application logins (SQL authentication). They already exist on every environment and their real +-- passwords live in Azure Key Vault; nothing here is a secret. +-- +-- The file exists so the users in this folder (fuchs_fds, fuchs_web) bind to a login when the project is +-- built: SSDT reports a user whose login is not in the model as error SQL71501, which is what kept the +-- database project from building at all (ADR 0036). On an existing server the deployment sees the login +-- as present and leaves it alone (SSDT never compares passwords); on a fresh server it is created with +-- an expired placeholder that must be changed before the login can be used. +CREATE LOGIN [fuchs_fds] WITH PASSWORD = N'Change-Me-Before-First-Use-1!' MUST_CHANGE, CHECK_EXPIRATION = ON, CHECK_POLICY = ON; +GO +CREATE LOGIN [fuchs_web] WITH PASSWORD = N'Change-Me-Before-First-Use-1!' MUST_CHANGE, CHECK_EXPIRATION = ON, CHECK_POLICY = ON; +GO diff --git a/Fuchs_Database/dbo/Functions/fds__fn_IntermediateIsAllocatedToOther.sql b/Fuchs_Database/dbo/Functions/fds__fn_IntermediateIsAllocatedToOther.sql index df58125..978d093 100644 --- a/Fuchs_Database/dbo/Functions/fds__fn_IntermediateIsAllocatedToOther.sql +++ b/Fuchs_Database/dbo/Functions/fds__fn_IntermediateIsAllocatedToOther.sql @@ -12,9 +12,13 @@ CREATE FUNCTION [dbo].[fds__fn_IntermediateIsAllocatedToOther] RETURNS bit AS BEGIN - DECLARE @IsA bit = CASE WHEN EXISTS (SELECT * FROM [dbo].[fds__invoices] as intermediates JOIN [dbo].[fds__invoice_details] as id on intermediates.[Id] = id.[InvId] and id.[AllocatedTo_InvId] is not null + -- An allocation only counts while the crediting invoice is alive: once that invoice is cancelled + -- (storno) its credit line is void and the Abschlagsrechnung must be offered again (ADR 0034). + DECLARE @IsA bit = CASE WHEN EXISTS (SELECT 1 FROM [dbo].[fds__invoices] as intermediates JOIN [dbo].[fds__invoice_details] as id on intermediates.[Id] = id.[InvId] and id.[AllocatedTo_InvId] is not null JOIN [dbo].[fds__invoices] as non_intermediates ON id.[AllocatedTo_InvId] = non_intermediates.[Id] and id.[AllocatedTo_InvId] is not null - WHERE intermediates.[Id] = @Intermediate_InvID and (@Target_InvID is null or non_intermediates.[Id] <> @Target_InvID)) + WHERE intermediates.[Id] = @Intermediate_InvID + and ISNULL(non_intermediates.[IsCanceled], 0) = 0 + and (@Target_InvID is null or non_intermediates.[Id] <> @Target_InvID)) THEN 1 ELSE 0 END; RETURN @isA; diff --git a/Fuchs_Database/dbo/Functions/fds__fn_invoiceBackdate.sql b/Fuchs_Database/dbo/Functions/fds__fn_invoiceBackdate.sql new file mode 100644 index 0000000..165252c --- /dev/null +++ b/Fuchs_Database/dbo/Functions/fds__fn_invoiceBackdate.sql @@ -0,0 +1,33 @@ +-- ============================================= +-- Description: Invoice backdating (ADR 0032). Returns the date an invoice may be backdated to +-- (the last working day Mon-Fri of the previous month, Europe/Berlin), or NULL when +-- backdating is not allowed: +-- * @authuser needs fds_inv > 2, and +-- * no invoice may have been finalized after that date yet (invoice numbers are +-- issued in date order; DateFinalized is stored in UTC, hence the 2h margin). +-- Single source for fds__setInvoiceFinal (@backdate = 1) and the preview dialog. +-- The check is only race-free inside fds__setInvoiceFinal, which serializes all +-- finalizations with a transaction-owned app lock; the preview call is advisory. +-- ============================================= +CREATE FUNCTION [dbo].[fds__fn_invoiceBackdate] +( + @authuser varchar(25) +) +RETURNS date +AS +BEGIN + IF [dbo].[fis_getModuleAuth]('fds_inv', @authuser) <= 2 + RETURN NULL; + + DECLARE @today date = CAST(SYSDATETIMEOFFSET() AT TIME ZONE 'W. Europe Standard Time' AS date); + DECLARE @eom date = EOMONTH(@today, -1); + -- DATEFIRST-independent weekday: 0 = Monday ... 5 = Saturday, 6 = Sunday + DECLARE @bd date = DATEADD(day, CASE DATEDIFF(day, '19000101', @eom) % 7 WHEN 5 THEN -1 WHEN 6 THEN -2 ELSE 0 END, @eom); + + IF EXISTS (SELECT 0 FROM [dbo].[fds__invoices] + WHERE [DateFinalized] IS NOT NULL + AND [DateFinalized] >= DATEADD(HOUR, -2, CAST(DATEADD(DAY, 1, @bd) AS datetime))) + RETURN NULL; + + RETURN @bd; +END diff --git a/Fuchs_Database/dbo/Functions/fds__fn_invoiceDate.sql b/Fuchs_Database/dbo/Functions/fds__fn_invoiceDate.sql new file mode 100644 index 0000000..246b633 --- /dev/null +++ b/Fuchs_Database/dbo/Functions/fds__fn_invoiceDate.sql @@ -0,0 +1,18 @@ +-- ============================================= +-- Description: The invoice date ("Rechnungsdatum", ADR 0032) as a German calendar day: +-- DateFinalized (the finalisation - or, when backdated, the backdated - moment), +-- falling back to DateCreated for drafts. Both columns are stored in UTC. +-- SQL twin of Fuchs/code/InvoiceDates.IssueDate. Every list, report, export and +-- reminder that shows or groups by an invoice date uses this function (ADR 0035). +-- Also used for reminders (fds__reminder has the same DateFinalized/DateCreated pair). +-- ============================================= +CREATE FUNCTION [dbo].[fds__fn_invoiceDate] +( + @DateFinalized datetime, + @DateCreated datetime +) +RETURNS date +AS +BEGIN + RETURN CAST(ISNULL(@DateFinalized, @DateCreated) AT TIME ZONE 'UTC' AT TIME ZONE 'W. Europe Standard Time' AS date); +END diff --git a/Fuchs_Database/dbo/Functions/fds__r_getBalanceThisMonth.sql b/Fuchs_Database/dbo/Functions/fds__r_getBalanceThisMonth.sql index 8a21d5c..8c5e9c2 100644 --- a/Fuchs_Database/dbo/Functions/fds__r_getBalanceThisMonth.sql +++ b/Fuchs_Database/dbo/Functions/fds__r_getBalanceThisMonth.sql @@ -20,11 +20,11 @@ BEGIN WITH inv as ( SELECT - [Dateofcreation] = i.[DateFinalized] + [Dateofcreation] = [dbo].[fds__fn_invoiceDate](i.[DateFinalized], i.[DateCreated]) ,i.[InvoiceBalance] ,[InvoiceBalanceNetto] = i.[InvoiceBalance_net] FROM [dbo].[fds__invoices] as i - WHERE i.[isFinal] = 1 AND [dbo].[date_monthfirst](i.[DateFinalized]) = @thismonthfirst + WHERE i.[isFinal] = 1 AND [dbo].[date_monthfirst]([dbo].[fds__fn_invoiceDate](i.[DateFinalized], i.[DateCreated])) = @thismonthfirst ) SELECT TOP(1) @ret = FORMAT( SUM( ISNULL(inv.[InvoiceBalanceNetto],0) ) * 0.001, '#,0 k€', 'de') FROM inv; END diff --git a/Fuchs_Database/dbo/Functions/fis_admin_testGroupMembership.sql b/Fuchs_Database/dbo/Functions/fis_admin_testGroupMembership.sql index 3c3bc99..240381c 100644 --- a/Fuchs_Database/dbo/Functions/fis_admin_testGroupMembership.sql +++ b/Fuchs_Database/dbo/Functions/fis_admin_testGroupMembership.sql @@ -14,7 +14,7 @@ BEGIN DECLARE @groups TABLE([usergroup_id] varchar(5)); INSERT INTO @groups SELECT * from STRING_SPLIT(@usergroup_id,','); - DECLARE @isMember bit = CASE WHEN EXISTS (SELECT * FROM [dbo].[fis_usergroups] as g + DECLARE @isMember bit = CASE WHEN EXISTS (SELECT 1 FROM [dbo].[fis_usergroups] as g JOIN @groups as groupstotest On groupstotest.[usergroup_id] = g.[usergroup_id] JOIN [dbo].[fis_usergroups_members] as gm on g.[usergroup_id] = gm.[usergroup_id] and gm.[DateDeleted] is null AND g.[DateDeleted] is null JOIN [dbo].[fis_useraccounts] as u on gm.[useraccount_id] = u.[useraccount_id] diff --git a/Fuchs_Database/dbo/Functions/ocms_fn_generatePassword.sql b/Fuchs_Database/dbo/Functions/ocms_fn_generatePassword.sql new file mode 100644 index 0000000..c86493b --- /dev/null +++ b/Fuchs_Database/dbo/Functions/ocms_fn_generatePassword.sql @@ -0,0 +1,88 @@ + + +CREATE FUNCTION [dbo].[ocms_fn_generatePassword] ( + @length int + , @specialChars bit = 1 + , @nums bit = 1 + , @lowerCase bit = 1 +) +RETURNS varchar(255) +AS +BEGIN + DECLARE @randInt int; + DECLARE @NewCharacter varchar(1); + DECLARE @NewPassword TABLE([typ] char(1), [char] char(1), [order] int); + + SET @length = CASE WHEN @length > 255 THEN 255 ELSE @length END; + + DECLARE @cnt int = 0, @position as int; + --random characters + WHILE (@cnt < @length) + BEGIN + SELECT @randInt = [dbo].[ocms_fn_randbetween](33,122) + + IF (CASE WHEN (@randInt>=33 AND @randInt<=47) AND @specialChars = 1 THEN 1 + WHEN (@randInt>=48 AND @randInt<=57) AND @nums = 1 THEN 1 + WHEN (@randInt>=58 AND @randInt<=64) AND @specialChars = 1 THEN 1 + WHEN (@randInt>=65 AND @randInt<=90) THEN 1 + WHEN (@randInt>=91 AND @randInt<=93) AND @specialChars = 1 THEN 1 + WHEN (@randInt>=97 AND @randInt<=122) AND @lowerCase = 1 THEN 1 + ELSE 0 + END) = 1 + BEGIN + SET @cnt = @cnt + 1; + + INSERT INTO @NewPassword + VALUES (CASE WHEN (@randInt>=33 AND @randInt<=47) THEN 's' + WHEN (@randInt>=48 AND @randInt<=57) THEN 'n' + WHEN (@randInt>=58 AND @randInt<=64) THEN 's' + WHEN (@randInt>=65 AND @randInt<=90) THEN 'u' + WHEN (@randInt>=91 AND @randInt<=93) THEN 's' + WHEN (@randInt>=97 AND @randInt<=122) THEN 'l' + END, + CHAR(@randInt), @cnt); + END + END + + DECLARE @min_n int = CASE WHEN @length > 4 AND @length < 11 THEN 1 ELSE FLOOR(@length * 0.1) END; + DECLARE @min_s int = FLOOR(@length * 0.1); + DECLARE @min_l int = FLOOR(@length * 0.4); + DECLARE @min_u int = FLOOR(@length * 0.4); + + WHILE (SELECT COUNT(*) FROM @NewPassword WHERE [typ] = 'n') < @min_n AND @length > 0 AND @nums = 1 + BEGIN + SET @position = [dbo].[ocms_fn_randbetween](1,@length); + UPDATE @NewPassword SET [char] = CHAR([dbo].[ocms_fn_randbetween](48,57)), [typ] = 'n' WHERE [order] = @position; + END + + WHILE (SELECT COUNT(*) FROM @NewPassword WHERE [typ] = 'l') < @min_l AND @length > 0 AND @lowerCase = 1 + BEGIN + SET @position = [dbo].[ocms_fn_randbetween](1,@length); + UPDATE @NewPassword SET [char] = CHAR([dbo].[ocms_fn_randbetween](97,122)), [typ] = 'l' WHERE [order] = @position; + END + + WHILE (SELECT COUNT(*) FROM @NewPassword WHERE [typ] = 'u') < @min_n AND @length > 0 + BEGIN + SET @position = [dbo].[ocms_fn_randbetween](1,@length); + UPDATE @NewPassword SET [char] = CHAR([dbo].[ocms_fn_randbetween](65,90)), [typ] = 'u' WHERE [order] = @position; + END + + WHILE (SELECT COUNT(*) FROM @NewPassword WHERE [typ] = 's') < @min_s AND @length > 0 AND @specialChars = 1 + BEGIN + SET @position = [dbo].[ocms_fn_randbetween](1,@length); + DECLARE @nc char(1), @nt char(1); + select @randInt=[dbo].[ocms_fn_randbetween](33,122) + + UPDATE @NewPassword SET [char] = CHAR(@randint), [typ] = 's' WHERE [order] = @position AND (CASE WHEN (@randInt>=33 AND @randInt<=47) THEN 's' + WHEN (@randInt>=48 AND @randInt<=57) THEN 'n' + WHEN (@randInt>=58 AND @randInt<=64) THEN 's' + WHEN (@randInt>=65 AND @randInt<=90) THEN 'u' + WHEN (@randInt>=91 AND @randInt<=93) THEN 's' + WHEN (@randInt>=97 AND @randInt<=122) THEN 'l' + END) = 's'; + END + + + + RETURN (Cast((SELECT [CHAR] as [text()] FROM @NewPassword FOR XML PATH(''),TYPE).value('.','NVARCHAR(MAX)') as varchar(255))); +END; \ No newline at end of file diff --git a/Fuchs_Database/dbo/Functions/ocms_fn_randbetween.sql b/Fuchs_Database/dbo/Functions/ocms_fn_randbetween.sql new file mode 100644 index 0000000..8c71bf9 --- /dev/null +++ b/Fuchs_Database/dbo/Functions/ocms_fn_randbetween.sql @@ -0,0 +1,8 @@ + + +CREATE FUNCTION [dbo].[ocms_fn_randbetween](@bottom integer, @top integer) +RETURNS integer +AS +BEGIN + RETURN (select cast(round((@top-@bottom) * [rn] +@bottom,0) as integer) from [dbo].[ocms_fn_rand]) +END \ No newline at end of file diff --git a/Fuchs_Database/dbo/Stored Procedures/fds__createReminder.sql b/Fuchs_Database/dbo/Stored Procedures/fds__createReminder.sql index dac340b..c174c50 100644 --- a/Fuchs_Database/dbo/Stored Procedures/fds__createReminder.sql +++ b/Fuchs_Database/dbo/Stored Procedures/fds__createReminder.sql @@ -96,7 +96,7 @@ BEGIN SELECT TOP(1) o.* , [InvoiceId] = inv.[InvoiceId] - , [InvoiceDate] = inv.[DateFinalized] + , [InvoiceDate] = [dbo].[fds__fn_invoiceDate](inv.[DateFinalized], inv.[DateCreated]) , [hasFile] = CAST ( CASE WHEN o.[file] is null THEN 0 ELSE 1 END as bit) , [UserNameFinalized] = [dbo].[fis_admin_getUserName_byID](o.[UserFinalized]) , [UserEmailFinalized] = [dbo].[fis_admin_getUserEmail_byID](o.[UserFinalized]) diff --git a/Fuchs_Database/dbo/Stored Procedures/fds__getDatevExports.sql b/Fuchs_Database/dbo/Stored Procedures/fds__getDatevExports.sql index 2f64508..fa46d7e 100644 --- a/Fuchs_Database/dbo/Stored Procedures/fds__getDatevExports.sql +++ b/Fuchs_Database/dbo/Stored Procedures/fds__getDatevExports.sql @@ -43,11 +43,16 @@ BEGIN ; + -- The invoice date (fds__fn_invoiceDate: DateFinalized as German day, ADR 0035) drives both the export + -- period and the Belegdatum; DateCreated is only the draft's creation and may lie in a later month for + -- a backdated invoice. + -- [DateOfCreation] keeps its name for the callers (HandleDatev / FdsMfr.GetDatevZip) but carries that day. DECLARE @inv TABLE([Id] varchar(20), [InvoiceID] varchar(255), [DocumentName] nvarchar(255), [DateOfCreation] date, [fds] bit, [file_guid] varchar(36)); INSERT INTO @inv - SELECT [Id],[invoiceid],[DocumentName],[DateOfCreation] = [DateCreated],[fds] = IIF([isExternal] = 0,1,0), [file_guid] + SELECT [Id],[invoiceid],[DocumentName],[DateOfCreation] = d.[InvoiceDate],[fds] = IIF([isExternal] = 0,1,0), [file_guid] FROM [dbo].[fds__invoices] - where CAST([DateCreated] as date) between @startdate AND @enddate and [isfinal] = 1; + CROSS APPLY (SELECT [InvoiceDate] = [dbo].[fds__fn_invoiceDate]([DateFinalized], [DateCreated])) as d + where [isfinal] = 1 and d.[InvoiceDate] between @startdate AND @enddate; SELECT inv.[Id],inv.[InvoiceID],inv.[DocumentName],inv.[fds] @@ -78,15 +83,15 @@ BEGIN ,[deb_cred] = CASE WHEN [invoiceBalance] >= 0 THEN 'S' ELSE 'H' END ,[customer] = (SELECT TOP(1) [ExternalId] FROM [dbo].[mfr__companies] as c WHERE c.[Id] = iv.[CustomerId]) ,[contra_account] = ca.[account] - ,[Belegdatum] = iv.[DateCreated] + ,[Belegdatum] = i.[DateOfCreation] -- the invoice date (DateFinalized as German day), see @inv ,[Buchungstext] = (SELECT TOP(1) SReq.[name] FROM @SReq as sreq WHERE iv.[Id] = sreq.[invoice.Id]) - ,[DateOfCreation] = iv.[DateCreated] - ,[file_guid] - from [dbo].[fds__invoices] as iv + ,[DateOfCreation] = i.[DateOfCreation] + ,[file_guid] = iv.[file_guid] + from [dbo].[fds__invoices] as iv + JOIN @inv as i on iv.[Id] = i.[Id] LEFT JOIN [dbo].[fds__invoice_details] as d on iv.[Id] = d.[InvId] LEFT JOIN sc on iv.[id] = sc.[invoice.Id] LEFT JOIN @contraaccounts as ca ON (CASE WHEN d.InvoiceOptions like '%§13b%' and RIGHT(ca.[name], 3) = '13b' then 1 WHEN d.InvoiceOptions like '%§13b%' THEN 0 when ISNULL(iv.[InvoiceVAT_1], 19.0) = ca.[vat] THEN 1 ELSE 0 END) = 1 - where iv.Id in (SELECT [Id] FROM @inv) ) select [Umsatz (ohne Soll/Haben-Kz)] = ABS([balance])--CAST(FORMAT(ABS([balance]), '0.00', 'de') as varchar(13)) diff --git a/Fuchs_Database/dbo/Stored Procedures/fds__getFDSDocument.sql b/Fuchs_Database/dbo/Stored Procedures/fds__getFDSDocument.sql index 9217ccd..626ed6b 100644 --- a/Fuchs_Database/dbo/Stored Procedures/fds__getFDSDocument.sql +++ b/Fuchs_Database/dbo/Stored Procedures/fds__getFDSDocument.sql @@ -16,15 +16,15 @@ BEGIN IF @type = 'invoice' BEGIN SELECT TOP(1) - [Id] = CAST([Id] as varchar(20)),[type] = @type, [InvoiceID],[DocumentName],[DateOfCreation] = [DateCreated],[fds] = CAST( 1 as bit), [file] - ,[order] = ROW_NUMBER() OVER (ORDER BY [DateCreated] ASC) + [Id] = CAST([Id] as varchar(20)),[type] = @type, [InvoiceID],[DocumentName],[DateOfCreation] = [dbo].[fds__fn_invoiceDate]([DateFinalized], [DateCreated]),[fds] = CAST( 1 as bit), [file] + ,[order] = ROW_NUMBER() OVER (ORDER BY [DateFinalized] ASC) FROM [dbo].[fds__invoices] WHERE [id] = @reportid AND [isFinal] = 1; END ELSE IF @type = 'reminder' BEGIN SELECT TOP(1) - [Id] = CAST([Id] as varchar(20)),[type] = @type, [ReminderID] = '',[DocumentName],[isInvoice] = 1,[DateOfCreation] = [DateCreated],[fds] = CAST( 1 as bit), [file] - ,[order] = ROW_NUMBER() OVER (ORDER BY [DateCreated] ASC) + [Id] = CAST([Id] as varchar(20)),[type] = @type, [ReminderID] = '',[DocumentName],[isInvoice] = 1,[DateOfCreation] = [dbo].[fds__fn_invoiceDate]([DateFinalized], [DateCreated]),[fds] = CAST( 1 as bit), [file] + ,[order] = ROW_NUMBER() OVER (ORDER BY [DateFinalized] ASC) FROM [dbo].[fds__reminder] WHERE [id] = @reportid AND [isFinal] = 1; END diff --git a/Fuchs_Database/dbo/Stored Procedures/fds__getInvoices_list.sql b/Fuchs_Database/dbo/Stored Procedures/fds__getInvoices_list.sql index bd6cd9a..f7d668e 100644 --- a/Fuchs_Database/dbo/Stored Procedures/fds__getInvoices_list.sql +++ b/Fuchs_Database/dbo/Stored Procedures/fds__getInvoices_list.sql @@ -46,9 +46,9 @@ BEGIN DECLARE @inv TABLE([Id] varchar(15), [InvoiceID] varchar(255), [URI] nvarchar(255), [DocumentName] nvarchar(255), [DateOfCreation] date, [fds] bit); - SELECT [Id],[invoiceid],[DocumentName],[DateOfCreation] = [DateCreated],[fds] = IIF([isExternal] = 0,1,0) + SELECT [Id],[invoiceid],[DocumentName],[DateOfCreation] = [dbo].[fds__fn_invoiceDate]([DateFinalized], [DateCreated]),[fds] = IIF([isExternal] = 0,1,0) FROM [dbo].[fds__invoices] - where CAST([DateCreated] as date) between @startdate AND @enddate and (ISNULL(@include_drafts,0) = 1 OR [isfinal] = 1); + where [dbo].[fds__fn_invoiceDate]([DateFinalized], [DateCreated]) between @startdate AND @enddate and (ISNULL(@include_drafts,0) = 1 OR [isfinal] = 1); DECLARE @SReq TABLE ([id] bigint, [DateOfCreation] datetime, [name] nvarchar(255), [invoice.Id] varchar(15), [customer.ExternalId] bigint, [customer.Id] bigint, [ExternalId] nvarchar(255), [fds] bit); INSERT INTO @SReq @@ -87,9 +87,9 @@ BEGIN ,[deb_cred] = CASE WHEN [invoiceBalance] >= 0 THEN 'S' ELSE 'H' END ,[customer] = (SELECT TOP(1) [customer.ExternalId] FROM @SReq as sreq WHERE iv.[Id] = sreq.[invoice.Id] and [customer.ExternalId] is not null ORDER BY SReq.DateOfCreation ASC) ,[contra_account] = ca.[account] - ,[Belegdatum] = FORMAT(iv.[DateCreated], 'dd.MM.yy') + ,[Belegdatum] = FORMAT([dbo].[fds__fn_invoiceDate](iv.[DateFinalized], iv.[DateCreated]), 'dd.MM.yy') ,[Buchungstext] = (SELECT TOP(1) SReq.[name] FROM @SReq as sreq WHERE iv.[Id] = sreq.[invoice.Id]) - ,[DateOfCreation] = iv.[DateCreated] + ,[DateOfCreation] = [dbo].[fds__fn_invoiceDate](iv.[DateFinalized], iv.[DateCreated]) ,[DueDate] ,[PaymentTerm] = ISNULL([PaymentTerm], @stage1) ,[PaymentStatus] diff --git a/Fuchs_Database/dbo/Stored Procedures/fds__getInvoices_list2.sql b/Fuchs_Database/dbo/Stored Procedures/fds__getInvoices_list2.sql index 8a89422..68d7dc7 100644 --- a/Fuchs_Database/dbo/Stored Procedures/fds__getInvoices_list2.sql +++ b/Fuchs_Database/dbo/Stored Procedures/fds__getInvoices_list2.sql @@ -69,23 +69,23 @@ BEGIN IF @searchmode = 'i' BEGIN insert into @inv - SELECT [Id],[invoiceid],[DocumentName],[DateOfCreation] = [DateCreated],[fds] = IIF([isExternal] = 0,1,0) + SELECT [Id],[invoiceid],[DocumentName],[DateOfCreation] = [dbo].[fds__fn_invoiceDate]([DateFinalized], [DateCreated]),[fds] = IIF([isExternal] = 0,1,0) FROM [dbo].[fds__invoices] where [InvoiceID] = @search OR [InvoiceID] like ('R20[0-9][0-9][-]' + @search); END ELSE IF @searchmode = 'c' BEGIN insert into @inv - SELECT [Id],[invoiceid],[DocumentName],[DateOfCreation] = [DateCreated],[fds] = IIF([isExternal] = 0,1,0) + SELECT [Id],[invoiceid],[DocumentName],[DateOfCreation] = [dbo].[fds__fn_invoiceDate]([DateFinalized], [DateCreated]),[fds] = IIF([isExternal] = 0,1,0) FROM [dbo].[fds__invoices] WHERE [CustomerId] IN (SELECT [CustomerId] fROM @customerfilter); END ELSE BEGIN insert into @inv - SELECT [Id],[invoiceid],[DocumentName],[DateOfCreation] = [DateCreated],[fds] = IIF([isExternal] = 0,1,0) + SELECT [Id],[invoiceid],[DocumentName],[DateOfCreation] = [dbo].[fds__fn_invoiceDate]([DateFinalized], [DateCreated]),[fds] = IIF([isExternal] = 0,1,0) FROM [dbo].[fds__invoices] - WHERE CAST([DateCreated] as date) between @startdate AND @enddate and (ISNULL(@include_drafts,0) = 1 OR [isfinal] = 1); + WHERE [dbo].[fds__fn_invoiceDate]([DateFinalized], [DateCreated]) between @startdate AND @enddate and (ISNULL(@include_drafts,0) = 1 OR [isfinal] = 1); END; @@ -126,9 +126,9 @@ BEGIN ,[deb_cred] = CASE WHEN [invoiceBalance] >= 0 THEN 'S' ELSE 'H' END --,[customer] = (SELECT TOP(1) [customer.ExternalId] FROM @SReq as sreq WHERE iv.[Id] = sreq.[invoice.Id] and [customer.ExternalId] is not null ORDER BY SReq.DateOfCreation ASC) ,[contra_account] = ca.[account] - ,[Belegdatum] = FORMAT(iv.[DateCreated], 'dd.MM.yy') + ,[Belegdatum] = FORMAT([dbo].[fds__fn_invoiceDate](iv.[DateFinalized], iv.[DateCreated]), 'dd.MM.yy') ,[Buchungstext] = (SELECT TOP(1) SReq.[name] FROM @SReq as sreq WHERE iv.[Id] = sreq.[invoice.Id]) - ,[DateOfCreation] = iv.[DateCreated] + ,[DateOfCreation] = [dbo].[fds__fn_invoiceDate](iv.[DateFinalized], iv.[DateCreated]) ,[DueDate] ,[PaymentTerm] = ISNULL([PaymentTerm], @stage1) ,[PaymentStatus] diff --git a/Fuchs_Database/dbo/Stored Procedures/fds__getInvoices_list_vario.sql b/Fuchs_Database/dbo/Stored Procedures/fds__getInvoices_list_vario.sql index 0b1978e..6caee1a 100644 --- a/Fuchs_Database/dbo/Stored Procedures/fds__getInvoices_list_vario.sql +++ b/Fuchs_Database/dbo/Stored Procedures/fds__getInvoices_list_vario.sql @@ -74,9 +74,9 @@ BEGIN DECLARE @inv TABLE([Id] varchar(15), [InvoiceID] varchar(255), [DocumentName] nvarchar(255), [DateOfCreation] date, [fds] bit); INSERT INTO @inv - SELECT [Id],[invoiceid],[DocumentName],[DateOfCreation] = [DateCreated],[fds] = IIF([isExternal] = 0,1,0) + SELECT [Id],[invoiceid],[DocumentName],[DateOfCreation] = [dbo].[fds__fn_invoiceDate]([DateFinalized], [DateCreated]),[fds] = IIF([isExternal] = 0,1,0) FROM [dbo].[fds__invoices] - where CAST([DateCreated] as date) between @startdate AND @enddate + where [dbo].[fds__fn_invoiceDate]([DateFinalized], [DateCreated]) between @startdate AND @enddate and (ISNULL(@include_drafts,0) = 1 OR [isfinal] = 1) and (@only_drafts = 0 OR [isfinal] = 0) and (@only_akonto = 0 OR [InvoiceType] = 'i') @@ -120,9 +120,9 @@ BEGIN ,[deb_cred] = CASE WHEN [invoiceBalance] >= 0 THEN 'S' ELSE 'H' END ,[customer] = (SELECT TOP(1) [customer.ExternalId] FROM @SReq as sreq WHERE iv.[Id] = sreq.[invoice.Id] and [customer.ExternalId] is not null ORDER BY SReq.DateOfCreation ASC) ,[contra_account] = ca.[account] - ,[Belegdatum] = FORMAT(iv.[DateCreated], 'dd.MM.yy') + ,[Belegdatum] = FORMAT([dbo].[fds__fn_invoiceDate](iv.[DateFinalized], iv.[DateCreated]), 'dd.MM.yy') ,[Buchungstext] = (SELECT TOP(1) SReq.[name] FROM @SReq as sreq WHERE iv.[Id] = sreq.[invoice.Id]) - ,[DateOfCreation] = iv.[DateCreated] + ,[DateOfCreation] = [dbo].[fds__fn_invoiceDate](iv.[DateFinalized], iv.[DateCreated]) ,[DueDate] ,[PaymentTerm] = ISNULL([PaymentTerm], @stage1) ,[PaymentStatus] diff --git a/Fuchs_Database/dbo/Stored Procedures/fds__getReminder.sql b/Fuchs_Database/dbo/Stored Procedures/fds__getReminder.sql index 93fc9fb..ecf1cc6 100644 --- a/Fuchs_Database/dbo/Stored Procedures/fds__getReminder.sql +++ b/Fuchs_Database/dbo/Stored Procedures/fds__getReminder.sql @@ -68,7 +68,7 @@ BEGIN ) SELECT TOP(1) o.* ,inv.[InvoiceId] - ,[InvoiceDate] = inv.[DateFinalized] + ,[InvoiceDate] = [dbo].[fds__fn_invoiceDate](inv.[DateFinalized], inv.[DateCreated]) ,[InvoiceFileName] = inv.[DocumentName] ,[InvoiceFile] = CASE WHEN ISNULL(@includefile,0) = 1 THEN inv.[file] else NULL END -- do not return file if not explicitly requested ,[hasFile] = CAST ( CASE WHEN o.[file] is null THEN 0 ELSE 1 END as bit) diff --git a/Fuchs_Database/dbo/Stored Procedures/fds__getReportDocument.sql b/Fuchs_Database/dbo/Stored Procedures/fds__getReportDocument.sql index 8f92b85..e5707d8 100644 --- a/Fuchs_Database/dbo/Stored Procedures/fds__getReportDocument.sql +++ b/Fuchs_Database/dbo/Stored Procedures/fds__getReportDocument.sql @@ -13,9 +13,9 @@ BEGIN DECLARE @idbigint bigint = TRY_CAST(@reportid as bigint); SELECT TOP(1) - [Id] = CAST([Id] as varchar(20)),[InvoiceID],[URI] = '',[DocumentName],[isInvoice] = 1,[DateOfCreation] = [DateCreated],[fds] = CAST( 1 as bit) + [Id] = CAST([Id] as varchar(20)),[InvoiceID],[URI] = '',[DocumentName],[isInvoice] = 1,[DateOfCreation] = [dbo].[fds__fn_invoiceDate]([DateFinalized], [DateCreated]),[fds] = CAST( 1 as bit) , [file] = ISNULL(iv.[file], (SELECT TOP(1) mfrf.[file] FROM [dbo].[fds__mfr_invoicefiles] as mfrf where iv.[IsExternal] = 1 and mfrf.[id] = iv.[externalid])) - , [order] = ROW_NUMBER() OVER (ORDER BY [DateCreated] ASC) + , [order] = ROW_NUMBER() OVER (ORDER BY [DateFinalized] ASC) FROM [dbo].[fds__invoices] as iv WHERE [id] = @reportid AND [isFinal] = 1; ; diff --git a/Fuchs_Database/dbo/Stored Procedures/fds__getRequest_details.sql b/Fuchs_Database/dbo/Stored Procedures/fds__getRequest_details.sql index e909bed..d74e35a 100644 --- a/Fuchs_Database/dbo/Stored Procedures/fds__getRequest_details.sql +++ b/Fuchs_Database/dbo/Stored Procedures/fds__getRequest_details.sql @@ -216,14 +216,14 @@ BEGIN [MappingId] [nvarchar](255) NULL, [ExternalId] [nvarchar](255) NULL, [Name] [nvarchar](255) NULL, - [Note] [nvarchar](255) NULL, + [Note] [nvarchar](max) NULL, [SupportTelephone] [nvarchar](255) NULL, [SupportFax] [nvarchar](255) NULL, [SupportMail] [nvarchar](255) NULL, [QuickSearch] [nvarchar](255) NULL, [DateModified] [datetime] NOT NULL, - [CustomValues] [nvarchar](max) NOT NULL, - [MainContactId] [bigint] NOT NULL, + [CustomValues] [nvarchar](max) NULL, + [MainContactId] [bigint] NULL, [address] nvarchar(1000) null ); INSERT INTO @company SELECT DISTINCT cy.*, [address] = [dbo].[fds__getCompanyAddress](cy.[id]) FROM [mfr__companies] as cy JOIN @SReq as s on cy.id = s.[CustomerId]; @@ -377,6 +377,7 @@ BEGIN ) SELECT [Id] = CAST(i.[Id] as varchar(20)) ,i.[DateCreated] + ,[InvoiceDate] = [dbo].[fds__fn_invoiceDate](i.[DateFinalized], i.[DateCreated]) ,[isFinal] ,[isSent] ,i.[DocumentName] @@ -387,10 +388,10 @@ BEGIN WHEN [DueDate] is null THEN 'op' WHEN [invoiceBalance] < 0 THEN '' WHEN @today >= [DueDate] THEN 'due' - WHEN @stage1 <> '' AND ISNULL(rem.[#],0) = 0 AND @today > [dbo].[date_addcustom](ISNULL(DueDate, i.[DateCreated]), @stage1) THEN 'ovd' + WHEN @stage1 <> '' AND ISNULL(rem.[#],0) = 0 AND @today > [dbo].[date_addcustom](ISNULL(DueDate, [dbo].[fds__fn_invoiceDate](i.[DateFinalized], i.[DateCreated])), @stage1) THEN 'ovd' WHEN ISNULL(rem.[#],0) > 0 THEN 'rem' END - ,[order] = ROW_NUMBER() OVER ( ORDER BY inv.[isChild], inv.[baseorder], i.[isFinal] DESC, i.[datecreated] ASC ) + ,[order] = ROW_NUMBER() OVER ( ORDER BY inv.[isChild], inv.[baseorder], i.[isFinal] DESC, [dbo].[fds__fn_invoiceDate](i.[DateFinalized], i.[DateCreated]) ASC ) FROM [dbo].[fds__invoices] as i JOIN inv on i.[Id] = inv.[Id] LEFT JOIN reminder as rem on inv.id = rem.[InvId] diff --git a/Fuchs_Database/dbo/Stored Procedures/fds__prepInvoice.sql b/Fuchs_Database/dbo/Stored Procedures/fds__prepInvoice.sql index e2e8948..5ebe102 100644 --- a/Fuchs_Database/dbo/Stored Procedures/fds__prepInvoice.sql +++ b/Fuchs_Database/dbo/Stored Procedures/fds__prepInvoice.sql @@ -189,14 +189,14 @@ BEGIN [MappingId] [nvarchar](255) NULL, [ExternalId] [nvarchar](255) NULL, [Name] [nvarchar](255) NULL, - [Note] [nvarchar](255) NULL, + [Note] [nvarchar](max) NULL, [SupportTelephone] [nvarchar](255) NULL, [SupportFax] [nvarchar](255) NULL, [SupportMail] [nvarchar](255) NULL, [QuickSearch] [nvarchar](255) NULL, [DateModified] [datetime] NOT NULL, - [CustomValues] [nvarchar](max) NOT NULL, - [MainContactId] [bigint] NOT NULL, + [CustomValues] [nvarchar](max) NULL, + [MainContactId] [bigint] NULL, [address] nvarchar(1000) null ); INSERT INTO @company SELECT DISTINCT cy.*, [address] = [dbo].[fds__getCompanyAddress](cy.[id]) FROM [mfr__companies] as cy JOIN @SReq as s on cy.id = s.[CustomerId]; @@ -228,6 +228,7 @@ BEGIN -- Add virtual items for intermediate invoices With associated_interims as ( SELECT inv.InvoiceVAT_1 + ,[InvId] = inv.[Id] --carried as reference_InvId so fds__setInvoiceFinal can record the allocation ,inv.InvoiceBalance_net ,inv.DocumentName ,inv.DateCreated @@ -259,7 +260,7 @@ BEGIN ,[NameOrNumber] = REPLACE(ai.DocumentName, '.pdf','') ,[CustomValues] = NULL ,[Note] = '

' + 'Anrechnung der ' + REPLACE(ai.DocumentName, '.pdf','') + ' vom ' + FORMAT(ai.[dateFinalized], 'dd.MM.yyyy', 'de-de') + '

' - ,[ExternalId] = NULL + ,[ExternalId] = ai.[InvId] --referenced intermediate invoice (-> reference_InvId) ,[Discount] = NULL ,[VAT] = ai.InvoiceVAT_1 ,[IsManual] = 1 @@ -289,7 +290,7 @@ BEGIN ,[NameOrNumber] = 'offener Betrag aus ' + REPLACE(ai.DocumentName, '.pdf','') ,[CustomValues] = NULL ,[Note] = '

' + 'Berechnung des offenen Betrags aus ' + REPLACE(ai.DocumentName, '.pdf','') + ' vom ' + FORMAT(ai.[dateFinalized], 'dd.MM.yyyy', 'de-de') + '

bereits gezahlt (brutto): ' + FORMAT([payed], '0.00', 'de') + '€.

' - ,[ExternalId] = NULL + ,[ExternalId] = ai.[InvId] --referenced intermediate invoice (-> reference_InvId) ,[Discount] = NULL ,[VAT] = ai.InvoiceVAT_1 ,[IsManual] = 1 @@ -393,6 +394,7 @@ BEGIN , [Note] = IIF(ISNULL([Discount], 0) > 0, 'Rabatt '+ FORMAT([discount]*0.01,'#.0%','de-de') + '', '') + ISNULL(itm.[Note],'') , [order] = (itm.[baseorder] * 100) + itm.[order] , [SetItmId] + , [reference_InvId] = CASE WHEN itm.[Type] IN ('IntInvoiceAllocation', 'IntInvoiceAllocationDiff') THEN CAST(itm.[ExternalId] as varchar(20)) ELSE NULL END FROM @itm as itm LEFT JOIN [dbo].[fds__custom_vat] as vat ON itm.[Id] = vat.[EntityId] and vat.[EntityType] = 'item'; END diff --git a/Fuchs_Database/dbo/Stored Procedures/fds__prepReminder.sql b/Fuchs_Database/dbo/Stored Procedures/fds__prepReminder.sql index dd356e1..b6d0fde 100644 --- a/Fuchs_Database/dbo/Stored Procedures/fds__prepReminder.sql +++ b/Fuchs_Database/dbo/Stored Procedures/fds__prepReminder.sql @@ -49,7 +49,7 @@ BEGIN END , [type] = @type , [invoiceid] = inv.[Invoiceid] - , [invoicedate] = inv.[DateFinalized] + , [invoicedate] = [dbo].[fds__fn_invoiceDate](inv.[DateFinalized], inv.[DateCreated]) , [amount] = inv.[InvoiceBalance] , [amount_payed] = CAST( ISNULL([dbo].[fds__fn_InvoicePaymentAmount_full](inv.[Id]),0.0) as numeric(10,2)) FROM inv; diff --git a/Fuchs_Database/dbo/Stored Procedures/fds__prepStorno_recreate.sql b/Fuchs_Database/dbo/Stored Procedures/fds__prepStorno_recreate.sql index c1a427d..faac51c 100644 --- a/Fuchs_Database/dbo/Stored Procedures/fds__prepStorno_recreate.sql +++ b/Fuchs_Database/dbo/Stored Procedures/fds__prepStorno_recreate.sql @@ -188,14 +188,14 @@ BEGIN [MappingId] [nvarchar](255) NULL, [ExternalId] [nvarchar](255) NULL, [Name] [nvarchar](255) NULL, - [Note] [nvarchar](255) NULL, + [Note] [nvarchar](max) NULL, [SupportTelephone] [nvarchar](255) NULL, [SupportFax] [nvarchar](255) NULL, [SupportMail] [nvarchar](255) NULL, [QuickSearch] [nvarchar](255) NULL, [DateModified] [datetime] NOT NULL, - [CustomValues] [nvarchar](max) NOT NULL, - [MainContactId] [bigint] NOT NULL, + [CustomValues] [nvarchar](max) NULL, + [MainContactId] [bigint] NULL, [address] nvarchar(1000) null ); INSERT INTO @company SELECT DISTINCT cy.*, [address] = [dbo].[fds__getCompanyAddress](cy.[id]) FROM [mfr__companies] as cy JOIN @SReq as s on cy.id = s.[CustomerId]; @@ -236,12 +236,12 @@ BEGIN ,[NameOrNumber] = REPLACE(inv.DocumentName, '.pdf','') ,[CustomValues] = NULL ,[Note] = '

' + 'Anrechnung der ' + REPLACE(inv.DocumentName, '.pdf','') + ' vom ' + FORMAT(inv.[dateFinalized], 'dd.MM.yyyy', 'de-de') + '

' - ,[ExternalId] = NULL + ,[ExternalId] = inv.[Id] --referenced intermediate invoice (-> reference_InvId) ,[Discount] = NULL ,[VAT] = inv.InvoiceVAT_1 ,[IsManual] = 1 ,[SortOrder] = ROW_NUMBER() OVER (PARTITION BY srq.[mfr__servicerequest] ORDER BY inv.[dateFinalized], inv.DateCreated) - ,[Type] = 'PartialInvoice' + ,[Type] = 'IntInvoiceAllocation' -- same line type as fds__prepInvoice: only this type is taken over as an allocation by fds__setInvoiceFinal ,[ServiceRequestId] = -2 --s.[id] ,[ServiceObjectId] = Null ,[CreatorId] = NULL @@ -292,7 +292,7 @@ BEGIN ,[NameOrNumber] = REPLACE(inv.DocumentName, '.pdf','') ,[CustomValues] = NULL ,[Note] = '

' + 'Storno der ' + REPLACE(inv.DocumentName, '.pdf','') + ' vom ' + FORMAT(inv.[dateFinalized], 'dd.MM.yyyy', 'de-de') + '

' - ,[ExternalId] = NULL + ,[ExternalId] = inv.[Id] --replaced invoice (-> reference_InvId; fds__setInvoiceFinal builds Replaces_InvId from it) ,[Discount] = NULL ,[VAT] = inv.InvoiceVAT_1 ,[IsManual] = 1 @@ -387,6 +387,7 @@ BEGIN , itm.[Note] , [order] = (itm.[baseorder] * 100) + itm.[order] , [SetItmId] + , [reference_InvId] = CASE WHEN itm.[Type] IN ('IntInvoiceAllocation', 'CanceledInvoice') THEN CAST(itm.[ExternalId] as varchar(20)) ELSE NULL END FROM @itm as itm LEFT JOIN [dbo].[fds__custom_vat] as vat ON itm.[Id] = vat.[EntityId] and vat.[EntityType] = 'item'; END diff --git a/Fuchs_Database/dbo/Stored Procedures/fds__r_getBalanceByMonth.sql b/Fuchs_Database/dbo/Stored Procedures/fds__r_getBalanceByMonth.sql index 2538e91..724329f 100644 --- a/Fuchs_Database/dbo/Stored Procedures/fds__r_getBalanceByMonth.sql +++ b/Fuchs_Database/dbo/Stored Procedures/fds__r_getBalanceByMonth.sql @@ -35,7 +35,7 @@ BEGIN WITH inv as ( SELECT - [Dateofcreation] = i.[DateCreatEd] + [Dateofcreation] = [dbo].[fds__fn_invoiceDate](i.[DateFinalized], i.[DateCreated]) ,i.[InvoiceBalance] ,[InvoiceBalanceNetto] = i.[InvoiceBalance_net] FROM [dbo].[fds__invoices] as i diff --git a/Fuchs_Database/dbo/Stored Procedures/fds__r_getBalanceByYearTopCustomer.sql b/Fuchs_Database/dbo/Stored Procedures/fds__r_getBalanceByYearTopCustomer.sql index 2bf8960..8b0bae8 100644 --- a/Fuchs_Database/dbo/Stored Procedures/fds__r_getBalanceByYearTopCustomer.sql +++ b/Fuchs_Database/dbo/Stored Procedures/fds__r_getBalanceByYearTopCustomer.sql @@ -39,21 +39,21 @@ BEGIN WITH inv as( select [InvoiceBalance] = SUM( ISNULL(_i.[InvoiceBalance],0) ) - ,[Dateofcreation] = CAST(_i.[DateCreated] as date) + ,[Dateofcreation] = [dbo].[fds__fn_invoiceDate](_i.[DateFinalized], _i.[DateCreated]) ,_i.CustomerId ,[customerName] = cy.Name - ,[seq] = ROW_NUMBER() OVER (ORDER BY CAST(_i.[DateCreated] as date)) + ,[seq] = ROW_NUMBER() OVER (ORDER BY [dbo].[fds__fn_invoiceDate](_i.[DateFinalized], _i.[DateCreated])) FROM [dbo].[fds__invoices] as _i JOIN [dbo].[mfr__companies] as cy on _i.CustomerId = cy.id - where YEAR(_i.[DateCreated]) = @year and _i.[isfinal] = 1 - GROUP BY CAST(_i.[DateCreated] as date), CustomerId, cy.name + where YEAR([dbo].[fds__fn_invoiceDate](_i.[DateFinalized], _i.[DateCreated])) = @year and _i.[isfinal] = 1 + GROUP BY [dbo].[fds__fn_invoiceDate](_i.[DateFinalized], _i.[DateCreated]), CustomerId, cy.name ), yr1 as ( SELECT - [year] = YEAR( _i.[DateCreated] ) + [year] = YEAR([dbo].[fds__fn_invoiceDate](_i.[DateFinalized], _i.[DateCreated])) , [total] = SUM( ISNULL(_i.[InvoiceBalance],0) ) FROM [dbo].[fds__invoices] as _i WHERE _i.[isfinal] = 1 - GROUP BY YEAR( _i.[DateCreated]) + GROUP BY YEAR([dbo].[fds__fn_invoiceDate](_i.[DateFinalized], _i.[DateCreated])) ), yr as ( SELECT [year], [total] = SUM([total]) from yr1 GROUP BY [year] diff --git a/Fuchs_Database/dbo/Stored Procedures/fds__r_getBalanceByYearTopMaterial.sql b/Fuchs_Database/dbo/Stored Procedures/fds__r_getBalanceByYearTopMaterial.sql index 1dc599b..99cc153 100644 --- a/Fuchs_Database/dbo/Stored Procedures/fds__r_getBalanceByYearTopMaterial.sql +++ b/Fuchs_Database/dbo/Stored Procedures/fds__r_getBalanceByYearTopMaterial.sql @@ -40,20 +40,20 @@ BEGIN WITH inv as( SELECT [itmPrice] = SUM( ISNULL(itm.[value_total],0) ) - ,[Dateofcreation] = CAST(_i.[DateCreated] as date) + ,[Dateofcreation] = [dbo].[fds__fn_invoiceDate](_i.[DateFinalized], _i.[DateCreated]) ,[material] = itm.[text] - ,[seq] = ROW_NUMBER() OVER (ORDER BY CAST(_i.[DateCreated] as date)) + ,[seq] = ROW_NUMBER() OVER (ORDER BY [dbo].[fds__fn_invoiceDate](_i.[DateFinalized], _i.[DateCreated])) FROM [dbo].[fds__invoices] as _i JOIN [fds__invoice_items] as itm on itm.[invid] = _i.[id] AND itm.[Type] like 'Material' - where YEAR(_i.[DateCreated]) = @year and _i.[isfinal] = 1 - GROUP BY CAST(_i.[DateCreated] as date), itm.[text] + where YEAR([dbo].[fds__fn_invoiceDate](_i.[DateFinalized], _i.[DateCreated])) = @year and _i.[isfinal] = 1 + GROUP BY [dbo].[fds__fn_invoiceDate](_i.[DateFinalized], _i.[DateCreated]), itm.[text] ), yr1 as ( SELECT - [year] = YEAR( _i.[DateCreated] ) + [year] = YEAR([dbo].[fds__fn_invoiceDate](_i.[DateFinalized], _i.[DateCreated])) , [total] = SUM( ISNULL(_i.[InvoiceBalance],0) ) FROM [dbo].[fds__invoices] as _i WHERE _i.[isfinal] = 1 - GROUP BY YEAR( _i.[DateCreated]) + GROUP BY YEAR([dbo].[fds__fn_invoiceDate](_i.[DateFinalized], _i.[DateCreated])) ), yr as ( SELECT [year], [total] = SUM([total]) from yr1 GROUP BY [year] diff --git a/Fuchs_Database/dbo/Stored Procedures/fds__r_getBalanceTrendByMonth.sql b/Fuchs_Database/dbo/Stored Procedures/fds__r_getBalanceTrendByMonth.sql index 23023a4..3b0fecb 100644 --- a/Fuchs_Database/dbo/Stored Procedures/fds__r_getBalanceTrendByMonth.sql +++ b/Fuchs_Database/dbo/Stored Procedures/fds__r_getBalanceTrendByMonth.sql @@ -47,10 +47,10 @@ BEGIN with inv as( select [InvoiceBalance] = SUM( ISNULL(_i.[InvoiceBalance],0) ) - ,[Dateofcreation] = CAST([Datecreated] as date) - ,[seq] = ROW_NUMBER() OVER (ORDER BY CAST([Datecreated] as date)) - FROM [dbo].[fds__invoices] as _i where _i.IsFinal = 1 and month([Datecreated]) = @Month and YEAR([Datecreated]) = @year - GROUP BY CAST([Datecreated] as date) + ,[Dateofcreation] = [dbo].[fds__fn_invoiceDate]([DateFinalized], [DateCreated]) + ,[seq] = ROW_NUMBER() OVER (ORDER BY [dbo].[fds__fn_invoiceDate]([DateFinalized], [DateCreated])) + FROM [dbo].[fds__invoices] as _i where _i.IsFinal = 1 and MONTH([dbo].[fds__fn_invoiceDate]([DateFinalized], [DateCreated])) = @Month and YEAR([dbo].[fds__fn_invoiceDate]([DateFinalized], [DateCreated])) = @year + GROUP BY [dbo].[fds__fn_invoiceDate]([DateFinalized], [DateCreated]) ) SELECT --[Monat] = FORMAT( inv.[Dateofcreation], 'yyyy - MM', 'de') diff --git a/Fuchs_Database/dbo/Stored Procedures/fds__r_getBalanceTrendByYear.sql b/Fuchs_Database/dbo/Stored Procedures/fds__r_getBalanceTrendByYear.sql index b26bc23..9333c73 100644 --- a/Fuchs_Database/dbo/Stored Procedures/fds__r_getBalanceTrendByYear.sql +++ b/Fuchs_Database/dbo/Stored Procedures/fds__r_getBalanceTrendByYear.sql @@ -46,10 +46,10 @@ BEGIN with inv as( select [InvoiceBalance] = SUM( ISNULL(_i.[InvoiceBalance],0) ) - ,[Dateofcreation] = CAST([Datecreated] as date) - ,[seq] = ROW_NUMBER() OVER (ORDER BY CAST([Datecreated] as date)) - FROM [dbo].[fds__invoices] as _i where _i.IsFinal = 1 and YEAR([Datecreated]) = @year - GROUP BY CAST([Datecreated] as date) + ,[Dateofcreation] = [dbo].[fds__fn_invoiceDate]([DateFinalized], [DateCreated]) + ,[seq] = ROW_NUMBER() OVER (ORDER BY [dbo].[fds__fn_invoiceDate]([DateFinalized], [DateCreated])) + FROM [dbo].[fds__invoices] as _i where _i.IsFinal = 1 and YEAR([dbo].[fds__fn_invoiceDate]([DateFinalized], [DateCreated])) = @year + GROUP BY [dbo].[fds__fn_invoiceDate]([DateFinalized], [DateCreated]) ) SELECT --[Monat] = FORMAT( inv.[Dateofcreation], 'yyyy - MM', 'de') diff --git a/Fuchs_Database/dbo/Stored Procedures/fds__setInvoiceFinal.sql b/Fuchs_Database/dbo/Stored Procedures/fds__setInvoiceFinal.sql index 8bdc449..95a6dfc 100644 --- a/Fuchs_Database/dbo/Stored Procedures/fds__setInvoiceFinal.sql +++ b/Fuchs_Database/dbo/Stored Procedures/fds__setInvoiceFinal.sql @@ -5,7 +5,8 @@ -- ============================================= CREATE PROCEDURE [dbo].[fds__setInvoiceFinal] @Id varchar(8), - @authuser varchar(25) + @authuser varchar(25), + @backdate bit = 0 -- 1: date the invoice to the last working day of the previous month (ADR 0032) AS BEGIN SET NOCOUNT ON; @@ -13,10 +14,33 @@ BEGIN THROW 60000, N'not authorized', 1; INSERT INTO [dbo].[fds__admin_activity] ([activity] ,[authuser] ,[info]) - VALUES ('fds__setInvoiceFinal' ,@authuser , (SELECT * FROM (VALUES(@Id, @authuser)) as z ([id],[authuser]) FOR JSON PATH, INCLUDE_NULL_VALUES, WITHOUT_ARRAY_WRAPPER)); + VALUES ('fds__setInvoiceFinal' ,@authuser , (SELECT * FROM (VALUES(@Id, @authuser, @backdate)) as z ([id],[authuser],[backdate]) FOR JSON PATH, INCLUDE_NULL_VALUES, WITHOUT_ARRAY_WRAPPER)); DECLARE @now datetime = GETUTCDATE(); + -- Finalizations are serialized: the "no later invoice" check of fds__fn_invoiceBackdate and the + -- numbering UPDATE below must not interleave with a concurrent finalization, or a higher invoice + -- number could end up with an earlier DateFinalized (ADR 0032). The app lock is transaction-owned + -- and released at COMMIT/ROLLBACK; every finalization (backdated or not) takes it. + SET XACT_ABORT ON; + BEGIN TRY + BEGIN TRANSACTION; + DECLARE @lock int; + EXEC @lock = sp_getapplock @Resource = N'fds__setInvoiceFinal', @LockMode = N'Exclusive', @LockOwner = N'Transaction', @LockTimeout = 15000; + IF @lock < 0 + THROW 60002, N'invoice finalization lock not acquired', 1; + + -- Invoice date: now, or (admins, fds_inv > 2) the last working day of the previous month as long as + -- no invoice has been finalized after it. Noon keeps the UTC-stored value on the same calendar day. + DECLARE @finalized datetime = @now, @backdateDay date = NULL; + IF ISNULL(@backdate, 0) = 1 + BEGIN + SET @backdateDay = [dbo].[fds__fn_invoiceBackdate](@authuser); + IF @backdateDay IS NULL + THROW 60001, N'backdating not allowed', 1; + SET @finalized = DATEADD(HOUR, 12, CAST(@backdateDay AS datetime)); + END + DECLARE @ids as TABLE([Id] varchar(10)); DECLARE @Replaces TABLE([RefInvID] varchar(10)); @@ -24,7 +48,9 @@ BEGIN DECLARE @Replaces_InvId varchar(50) = CASE WHEN EXISTS(SELECT * FROM @Replaces) THEN STUFF( (SELECT ',' + [refinvid] as [Text] FROM @replaces FOR XML PATH, TYPE).value('.', 'nvarchar(max)'), 1, 1, '') ELSE NULL END; - UPDATE [dbo].[fds__invoices] SET [DateFinalized] = @now, [UserFinalized] = @authuser, [DateModified] = @now, [UserModified] = @authuser, [invoiceid] = [dbo].[fds__newInvoiceId](Year(@now)), [version] = (ISNULL([version],0) + 1), [Replaces_InvId] = @Replaces_InvId + UPDATE [dbo].[fds__invoices] SET [DateFinalized] = @finalized, [UserFinalized] = @authuser, [DateModified] = @now, [UserModified] = @authuser, [invoiceid] = [dbo].[fds__newInvoiceId](Year(@finalized)), + [DueDate] = CASE WHEN @backdateDay IS NULL THEN [DueDate] -- same term arithmetic as fds__setInvoice, anchored on the backdated invoice date + ELSE DATEADD(DAY, ISNULL(TRY_PARSE(REPLACE(REPLACE(ISNULL([PaymentTerm], '10wd'), 'w', ''), 'd', '') AS tinyint), 10), @backdateDay) END, [version] = (ISNULL([version],0) + 1), [Replaces_InvId] = @Replaces_InvId OUTPUT inserted.[id] INTO @ids WHERE [Id] = @Id AND @Id is not null and [isFinal] = 0 and [isSent] = 0; @@ -32,35 +58,54 @@ BEGIN SELECT iv.* FROM [dbo].[fds__invoices] as iv JOIN @ids as ids on iv.[id] = ids.Id; --this is necessary to get calculated fields also - -- update references of intermediate invoices + -- update references of intermediate invoices (ADR 0034) WITH IntInvoiceAllocs as( - SELECT [tgtInvId] = @Id, [reference_InvId] FROM [dbo].[fds__invoice_items] where [Type] = 'IntInvoiceAllocation' AND [InvId] = @Id + SELECT DISTINCT [tgtInvId] = @Id, [reference_InvId] FROM [dbo].[fds__invoice_items] where [Type] = 'IntInvoiceAllocation' AND [InvId] = @Id + AND ISNULL([reference_InvId], '') <> '' -- a NULL reference used to abort this MERGE (515 on fds__invoice_details.InvId) + -- a Stornorechnung (copy) mirrors the cancelled invoice's credit lines but consumes no Abschlagsrechnung + AND EXISTS (SELECT * FROM [dbo].[fds__invoices] as me WHERE me.[Id] = @Id AND me.[InvoiceType] <> 'c') ), existing as ( - SELECT intermediates.Id - FROM [dbo].[fds__invoice_details] as id - JOIN [dbo].[fds__invoices] as intermediates on id.[InvId] = intermediates.[id] + -- intermediates already credited on ANOTHER *live* invoice: a credit on a cancelled invoice, or on the + -- invoice this one replaces (storno + recreate), is void and may be taken over + SELECT intermediates.Id + FROM [dbo].[fds__invoice_details] as id + JOIN [dbo].[fds__invoices] as intermediates on id.[InvId] = intermediates.[id] JOIN IntInvoiceAllocs as iia on iia.[reference_InvId] = intermediates.[Id] + JOIN [dbo].[fds__invoices] as tgt on tgt.[Id] = id.[AllocatedTo_InvId] -- (a dangling AllocatedTo_InvId counts as free) WHERE ISNULL(intermediates.[iscanceled], 0) = 0 AND isnull(intermediates.[isfinal],0) = 1 -- reallocation is allowed for cancelled inv. - and ISNULL(id.[AllocatedTo_InvId], '6AA609E8-1') <> @id + and tgt.[Id] <> @Id -- (an unallocated one used to count as taken, so nothing was ever allocated) + and ISNULL(tgt.[IsCanceled], 0) = 0 + and NOT EXISTS (SELECT * FROM @Replaces as r WHERE r.[RefInvID] = tgt.[Id]) ) MERGE [dbo].[fds__invoice_details] as TARGET USING IntInvoiceAllocs as iia ON TARGET.[InvID] = iia.[reference_InvId] - WHEN NOT MATCHED BY TARGET - AND NOT EXISTS (SELECT * FROM existing WHERE existing.[id] = iia.[reference_InvId]) THEN + WHEN NOT MATCHED BY TARGET + AND NOT EXISTS (SELECT * FROM existing WHERE existing.[id] = iia.[reference_InvId]) THEN INSERT ([InvId] ,[AllocatedTo_InvId]) VALUES (iia.[reference_InvId], iia.[tgtInvId]) - WHEN NOT MATCHED BY SOURCE THEN - UPDATE - SET [AllocatedTo_InvId] = NULL + WHEN MATCHED -- free, ours already, or held by a cancelled/replaced invoice -> (re)allocate to this one + AND NOT EXISTS (SELECT * FROM existing WHERE existing.[id] = iia.[reference_InvId]) THEN + UPDATE + SET [AllocatedTo_InvId] = iia.[tgtInvId] + WHEN NOT MATCHED BY SOURCE AND TARGET.[AllocatedTo_InvId] = @Id THEN -- only this invoice's own stale allocations (was: every row of the table) + UPDATE + SET [AllocatedTo_InvId] = NULL ; --updated replaced invoices UPDATE refinv - SET [DateCancelled] = @now, [UserCancelled] = @authuser, [version] = (ISNULL([version],0) + 1) + SET [DateCancelled] = @finalized, [UserCancelled] = @authuser, [version] = (ISNULL([version],0) + 1) FROM [dbo].[fds__invoices] as refinv JOIN @Replaces as r on refinv.Id = r.[RefInvID] WHERE refinv.[isFinal] = 1 and refinv.[IsCanceled] = 0; --update replaced invoices (by stornos) EXECUTE [dbo].[fds__maint__updateCancelledStatus]; + + COMMIT TRANSACTION; + END TRY + BEGIN CATCH + IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION; + THROW; -- keeps the original number (60001 = backdating not allowed) for the caller + END CATCH; END \ No newline at end of file diff --git a/Fuchs_Database/dbo/Tables/mfr__companies.sql b/Fuchs_Database/dbo/Tables/mfr__companies.sql index 5d83872..882c004 100644 --- a/Fuchs_Database/dbo/Tables/mfr__companies.sql +++ b/Fuchs_Database/dbo/Tables/mfr__companies.sql @@ -9,7 +9,7 @@ [MappingId] NVARCHAR (255) NULL, [ExternalId] NVARCHAR (255) NULL, [Name] NVARCHAR (255) NULL, - [Note] NVARCHAR (255) NULL, + [Note] NVARCHAR (MAX) NULL, [SupportTelephone] NVARCHAR (255) NULL, [SupportFax] NVARCHAR (255) NULL, [SupportMail] NVARCHAR (255) NULL, diff --git a/Fuchs_Database/dbo/Tables/mfr__serviceobjects.sql b/Fuchs_Database/dbo/Tables/mfr__serviceobjects.sql index 38915e0..9ce3e7f 100644 --- a/Fuchs_Database/dbo/Tables/mfr__serviceobjects.sql +++ b/Fuchs_Database/dbo/Tables/mfr__serviceobjects.sql @@ -2,7 +2,7 @@ [Id] BIGINT NOT NULL, [Location#ID] BIGINT NULL, [Name] NVARCHAR (255) NULL, - [Note] NVARCHAR (255) NULL, + [Note] NVARCHAR (MAX) NULL, [CustomValues] NVARCHAR (MAX) NOT NULL, [DateModified] DATETIME NOT NULL, [ExternalId] NVARCHAR (255) NULL, diff --git a/Fuchs_Database/dbo/User Defined Types/mfr__tt__companies.sql b/Fuchs_Database/dbo/User Defined Types/mfr__tt__companies.sql index 01aee8d..4feebdd 100644 --- a/Fuchs_Database/dbo/User Defined Types/mfr__tt__companies.sql +++ b/Fuchs_Database/dbo/User Defined Types/mfr__tt__companies.sql @@ -10,7 +10,7 @@ [MappingId] NVARCHAR (255) NULL, [ExternalId] NVARCHAR (255) NULL, [Name] NVARCHAR (255) NULL, - [Note] NVARCHAR (255) NULL, + [Note] NVARCHAR (MAX) NULL, [SupportTelephone] NVARCHAR (255) NULL, [SupportFax] NVARCHAR (255) NULL, [SupportMail] NVARCHAR (255) NULL, diff --git a/Fuchs_Database/dbo/User Defined Types/mfr__tt__serviceobjects.sql b/Fuchs_Database/dbo/User Defined Types/mfr__tt__serviceobjects.sql index 3ae24d5..6e81639 100644 --- a/Fuchs_Database/dbo/User Defined Types/mfr__tt__serviceobjects.sql +++ b/Fuchs_Database/dbo/User Defined Types/mfr__tt__serviceobjects.sql @@ -3,7 +3,7 @@ [Id] BIGINT NOT NULL, [Location#ID] BIGINT NULL, [Name] NVARCHAR (255) NULL, - [Note] NVARCHAR (255) NULL, + [Note] NVARCHAR (MAX) NULL, [CustomValues] NVARCHAR (MAX) NOT NULL, [DateModified] DATETIME NOT NULL, [ExternalId] NVARCHAR (255) NULL,