Add unit tests for Fuchs_DataService and related components

- Introduced comprehensive unit tests for the Fuchs_DataService library, covering DATEV header formatting, CSV/XML generation, and FdsMfrClient construction.
- Implemented tests for FdsMfr.UpdateNeed parsing and FdsShared utility helpers, ensuring correct functionality and stability.
- Added tests for FdsConfig and FdsMfrClient to validate configuration resolution and client construction.

Document decisions on backend-authoritative invoice and reminder handling

- Created ADR 0008 to clarify that all invoice types and reminder stages are backend-authoritative during drafting and previewing.
- Established that all calculations and settings must be processed server-side, ensuring consistency between online editor and PDF outputs.

Define irreversible mutations for set-price modes in invoices

- Documented ADR 0009 to specify that the "Set mit Preis" and "Nur Set mit Preis" operations are irreversible mutations affecting service request blocks.
- Clarified that these operations are not display toggles but actual data changes, ensuring clear expectations for invoice handling.

Transition MFR ERP sync to in-process execution within the web app

- Created ADR 0010 to outline the migration of Fuchs_DataService from a standalone service to an in-process library within the Fuchs web application.
- Updated configuration and logging management to be handled by the host application, streamlining the sync process.

Add publish profile and periodic hosted service for job scheduling

- Introduced a publish profile for deployment to a specified folder.
- Implemented PeriodicHostedService to manage multiple independent jobs, including the MFR ERP sync, with configurable execution intervals.

Add dotnet-tools.json for EF Core CLI tools

- Included dotnet-tools.json to manage the version of dotnet-ef for Entity Framework Core migrations and commands.
This commit is contained in:
Stefan
2026-07-16 13:34:23 +02:00
parent f724b9b59d
commit 49e3ed2673
102 changed files with 2501 additions and 8438 deletions
+10 -2
View File
@@ -814,7 +814,7 @@ $ocms.postXT = function (options) {
if ((typeof options.contentType === 'boolean' ? options.contentType === false : false) === true) {
ajo.contentType = false; /* needed for file uploads */
}
$.ajax(ajo);
return $.ajax(ajo);
};
$ocms.cex_timer = function () {
if (!$ocms.cexi) {
@@ -2670,7 +2670,15 @@ if (!Element.prototype.closest) {
_onPress: function (e) {
if (!e) { return; }
function op(tgt) {
if (tgt && tgt.parentNode === this._container && (this._dragHandleClass === '' || e.target.className.indexOf(this._dragHandleClass) > -1) && tgt.className.indexOf("nosort") < 0) {
// Match the drag handle by real CSS class token, not substring. The old
// e.target.className.indexOf('ico') matched every Bootstrap "glyph[ico]n" icon,
// so clicking any icon button (edit/delete/set-price…) inside a sortable row
// started a zero-distance drag that swallowed the button's own click. Using
// closest('.<handle>') restricts dragging to the dedicated handle element (e.g.
// the ".ico" move button) and its descendants only.
var isHandle = this._dragHandleClass === '' ||
(e.target.closest && e.target.closest('.' + this._dragHandleClass) != null);
if (tgt && tgt.parentNode === this._container && isHandle && tgt.className.indexOf("nosort") < 0) {
e.preventDefault();
this._dragging = true;
this._click = getPoint(e);