diff --git a/backend/docker_push.sh b/backend/docker_push.sh
index f3289fe..2f339a5 100755
--- a/backend/docker_push.sh
+++ b/backend/docker_push.sh
@@ -64,7 +64,8 @@ cd "${SCRIPT_DIR}"
echo "Verwende Release-Version ${VERSION}."
echo "Baue Production-JAR für Version ${VERSION} ..."
-(cd "${BACKEND_DIR}" && ./mvnw -Pproduction -DskipTests -Drevision="${VERSION}" package)
+# Klassen aus vorherigen Maven-/IDE-Builds vor dem Vaadin-Klassenscan entfernen.
+(cd "${BACKEND_DIR}" && ./mvnw -e -Pproduction -DskipTests -Drevision="${VERSION}" clean package)
JAR_FILE_REL="target/votianlt-${VERSION}.jar"
JAR_FILE_ABS="${BACKEND_DIR}/${JAR_FILE_REL}"
diff --git a/backend/pom.xml b/backend/pom.xml
index ff1981f..00cc5db 100644
--- a/backend/pom.xml
+++ b/backend/pom.xml
@@ -11,7 +11,7 @@
jar
- 0.9.24
+ 0.9.25
21
21
21
diff --git a/backend/src/main/bundles/dev.bundle b/backend/src/main/bundles/dev.bundle
index 76304aa..928496d 100644
Binary files a/backend/src/main/bundles/dev.bundle and b/backend/src/main/bundles/dev.bundle differ
diff --git a/backend/src/main/bundles/prod.bundle b/backend/src/main/bundles/prod.bundle
index 8c8689d..f16e5fd 100644
Binary files a/backend/src/main/bundles/prod.bundle and b/backend/src/main/bundles/prod.bundle differ
diff --git a/backend/src/main/frontend/invoice-generator/profile-invoice-generator.js b/backend/src/main/frontend/invoice-generator/profile-invoice-generator.js
index b4611e8..26ee773 100644
--- a/backend/src/main/frontend/invoice-generator/profile-invoice-generator.js
+++ b/backend/src/main/frontend/invoice-generator/profile-invoice-generator.js
@@ -233,28 +233,9 @@ window.initProfileInvoiceGenerator = function() {
var img = new Image();
img.onload = function() {
imageCache[el.imageData] = img;
- // Calculate dimensions to maintain aspect ratio
- var imgAspect = img.width / img.height;
- var boxAspect = w / h;
- var drawW, drawH, drawX, drawY;
-
- if (imgAspect > boxAspect) {
- drawW = w;
- drawH = w / imgAspect;
- drawX = x;
- drawY = y + (h - drawH) / 2;
- } else {
- drawW = h * imgAspect;
- drawH = h;
- drawX = x + (w - drawW) / 2;
- drawY = y;
- }
-
- ctx.drawImage(img, drawX, drawY, drawW, drawH);
- // Redraw selection if this element is selected
- if (selectedElement && selectedElement.id === el.id) {
- drawSelection(el);
- }
+ // Redraw in element order: a letterhead loaded asynchronously must
+ // stay behind the invoice text, including after resize or removal.
+ draw();
};
img.src = el.imageData;
}
diff --git a/backend/src/main/java/de/assecutor/votianlt/controller/MessageController.java b/backend/src/main/java/de/assecutor/votianlt/controller/MessageController.java
index b7e03fa..53c9a91 100644
--- a/backend/src/main/java/de/assecutor/votianlt/controller/MessageController.java
+++ b/backend/src/main/java/de/assecutor/votianlt/controller/MessageController.java
@@ -405,7 +405,8 @@ public class MessageController {
try {
String taskType = task.getTaskType() != null ? task.getTaskType().toString() : "Unknown";
String completedBy = resolveTaskActor(task, appUserId);
- emailService.sendTaskCompletionNotification(jobId, taskType, taskIdStr, completedBy);
+ emailService.sendTaskCompletionNotification(jobId, taskType, taskIdStr, completedBy,
+ task.getDescription());
// Job completion is no longer auto-triggered by task completion.
// It is now driven by explicit station_completed messages from the app
// (see handleStationCompleted).
diff --git a/backend/src/main/java/de/assecutor/votianlt/service/CustomerInvoiceService.java b/backend/src/main/java/de/assecutor/votianlt/service/CustomerInvoiceService.java
index 6e06cb1..79a153d 100644
--- a/backend/src/main/java/de/assecutor/votianlt/service/CustomerInvoiceService.java
+++ b/backend/src/main/java/de/assecutor/votianlt/service/CustomerInvoiceService.java
@@ -324,7 +324,7 @@ public class CustomerInvoiceService {
htmlBuilder.append("