From 3f1c17e7c0687d8281d57317953c9738e4a14112 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Tue, 7 Oct 2025 11:43:11 +0200 Subject: [PATCH 1/3] creating new customer settings if required --- .../java/de/srsoftware/umbrella/documents/DocumentApi.java | 1 + .../main/java/de/srsoftware/umbrella/documents/SqliteDb.java | 5 ++--- .../umbrella/documents/model/CustomerSettings.java | 4 ++++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentApi.java b/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentApi.java index 71f3812..6be32ad 100644 --- a/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentApi.java +++ b/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentApi.java @@ -488,6 +488,7 @@ public class DocumentApi extends BaseHandler implements DocumentService { String currency = company.currency(); String sep = company.decimalSeparator(); var settings = db.getCustomerSettings(companyId.longValue(),type,customer.id()); + if (settings == null) settings = CustomerSettings.empty(); var companySettings = db.getCompanySettings(companyId.longValue(),type); var nextNumber = companySettings.nextDocId(); String lastHead = settings.header(); diff --git a/documents/src/main/java/de/srsoftware/umbrella/documents/SqliteDb.java b/documents/src/main/java/de/srsoftware/umbrella/documents/SqliteDb.java index 51113ec..8b3a95f 100644 --- a/documents/src/main/java/de/srsoftware/umbrella/documents/SqliteDb.java +++ b/documents/src/main/java/de/srsoftware/umbrella/documents/SqliteDb.java @@ -285,12 +285,11 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255) CustomerSettings settings = null; if (rs.next()) settings = CustomerSettings.of(rs); rs.close(); - if (settings != null) return settings; - + return settings; } catch (SQLException e) { LOG.log(WARNING,"Failed to load customer settings (company: {0}, document type: {1}",companyId, docType.name(),e); + throw new UmbrellaException(500,"Failed to load customer settings (company: {0}, document type: {1}",companyId, docType.name()); } - throw new UmbrellaException(500,"Failed to load customer settings (company: {0}, document type: {1}",companyId, docType.name()); } @Override diff --git a/documents/src/main/java/de/srsoftware/umbrella/documents/model/CustomerSettings.java b/documents/src/main/java/de/srsoftware/umbrella/documents/model/CustomerSettings.java index 2a96613..ac3a771 100644 --- a/documents/src/main/java/de/srsoftware/umbrella/documents/model/CustomerSettings.java +++ b/documents/src/main/java/de/srsoftware/umbrella/documents/model/CustomerSettings.java @@ -18,6 +18,10 @@ public record CustomerSettings(String header, String footer, String mailText) im return new CustomerSettings(header,footer,mailText); } + public static CustomerSettings empty() { + return new CustomerSettings("","",""); + } + @Override public Map toMap() { return Map.of(FIELD_FOOTER,footer,FIELD_HEAD,header,CONTENT,mailText); From 037037747f94e0f7525190ca029c846fc832687e Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Tue, 7 Oct 2025 14:42:30 +0200 Subject: [PATCH 2/3] working on customer settings creation Signed-off-by: Stephan Richter --- .../umbrella/core/model/Document.java | 7 +++ .../umbrella/documents/DocumentApi.java | 8 ++- .../umbrella/documents/SqliteDb.java | 1 + .../documents/model/CustomerSettings.java | 60 +++++++++++++++++-- 4 files changed, 69 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/de/srsoftware/umbrella/core/model/Document.java b/core/src/main/java/de/srsoftware/umbrella/core/model/Document.java index 8aceb29..96973f2 100644 --- a/core/src/main/java/de/srsoftware/umbrella/core/model/Document.java +++ b/core/src/main/java/de/srsoftware/umbrella/core/model/Document.java @@ -169,6 +169,13 @@ public final class Document implements Mappable { return !dirtyFields.isEmpty() || sender.isDirty() || customer.isDirty(); } + public boolean isDirty(String ... fields){ + for (var field : fields){ + if (dirtyFields.contains(field)) return true; + } + return false; + } + public boolean isNew(){ return dirtyFields.contains(ID); } diff --git a/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentApi.java b/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentApi.java index 6be32ad..1c7b310 100644 --- a/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentApi.java +++ b/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentApi.java @@ -411,7 +411,13 @@ public class DocumentApi extends BaseHandler implements DocumentService { private boolean patchDocument(long docId, UmbrellaUser user, HttpExchange ex) throws UmbrellaException, IOException { var doc = getDocument(docId,user).a; - doc.patch(json(ex)); + var data = json(ex); + doc.patch(data); + if (doc.isDirty(FIELD_FOOTER,FIELD_HEAD)) { + var settings = db.getCustomerSettings(doc.companyId(),doc.type(),doc.customer().id()); + if (settings == null) settings = CustomerSettings.empty(); + db.save(doc.companyId(),doc.type(),doc.customer().id(), settings.patch(data)); + } db.save(doc); return ok(ex); } diff --git a/documents/src/main/java/de/srsoftware/umbrella/documents/SqliteDb.java b/documents/src/main/java/de/srsoftware/umbrella/documents/SqliteDb.java index 8b3a95f..1c82f82 100644 --- a/documents/src/main/java/de/srsoftware/umbrella/documents/SqliteDb.java +++ b/documents/src/main/java/de/srsoftware/umbrella/documents/SqliteDb.java @@ -556,6 +556,7 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255) @Override public CustomerSettings save(long companyId, Type docType, String customerId, CustomerSettings settings) throws UmbrellaException { + if (!settings.isDirty()) return settings; try { replaceInto(TABLE_CUSTOMER_SETTINGS,FIELD_COMPANY_ID,FIELD_DOC_TYPE_ID,FIELD_CUSTOMER_NUMBER,FIELD_DEFAULT_HEADER,FIELD_DEFAULT_FOOTER,FIELD_DEFAULT_MAIL) .values(companyId,docType.id(),customerId,settings.header(),settings.footer(),settings.mailText()) diff --git a/documents/src/main/java/de/srsoftware/umbrella/documents/model/CustomerSettings.java b/documents/src/main/java/de/srsoftware/umbrella/documents/model/CustomerSettings.java index ac3a771..e2b392a 100644 --- a/documents/src/main/java/de/srsoftware/umbrella/documents/model/CustomerSettings.java +++ b/documents/src/main/java/de/srsoftware/umbrella/documents/model/CustomerSettings.java @@ -3,14 +3,50 @@ package de.srsoftware.umbrella.documents.model; import static de.srsoftware.umbrella.core.Constants.*; -import static de.srsoftware.umbrella.documents.Constants.*; import de.srsoftware.tools.Mappable; +import org.json.JSONObject; + import java.sql.ResultSet; import java.sql.SQLException; +import java.util.HashSet; import java.util.Map; -public record CustomerSettings(String header, String footer, String mailText) implements Mappable { +public class CustomerSettings implements Mappable { + private static final System.Logger LOG = System.getLogger(CustomerSettings.class.getSimpleName()); + private String footer, header, mailText; + private HashSet dirtyFields = new HashSet<>(); + + public CustomerSettings(String header, String footer, String mailText){ + this.header = header; + this.footer = footer; + this.mailText = mailText; + } + + public CustomerSettings clear(){ + dirtyFields.clear(); + return this; + } + public static CustomerSettings empty() { + return new CustomerSettings("","",""); + } + + public String footer(){ + return footer; + } + + public String header() { + return header; + } + + public boolean isDirty() { + return !dirtyFields.isEmpty(); + } + + public String mailText(){ + return mailText; + } + public static CustomerSettings of(ResultSet rs) throws SQLException { var header = rs.getString(FIELD_DEFAULT_HEADER); var footer = rs.getString(FIELD_DEFAULT_FOOTER); @@ -18,12 +54,24 @@ public record CustomerSettings(String header, String footer, String mailText) im return new CustomerSettings(header,footer,mailText); } - public static CustomerSettings empty() { - return new CustomerSettings("","",""); - } - @Override public Map toMap() { return Map.of(FIELD_FOOTER,footer,FIELD_HEAD,header,CONTENT,mailText); } + + public CustomerSettings patch(JSONObject json) { + for (var key : json.keySet()){ + var valid = true; + switch (key){ + case FIELD_FOOTER: + footer = json.getString(key); break; + case FIELD_HEAD: + header = json.getString(key); break; + default: + valid = false; + } + if (valid) dirtyFields.add(key); + } + return this; + } } From 97feb317a7e2bc0c23be72ab7dfb1b9c14f75781 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Tue, 7 Oct 2025 20:32:52 +0200 Subject: [PATCH 3/3] extended translations Signed-off-by: Stephan Richter --- translations/src/main/resources/de.json | 1 + translations/src/main/resources/en.json | 1 + 2 files changed, 2 insertions(+) diff --git a/translations/src/main/resources/de.json b/translations/src/main/resources/de.json index 16329f4..9c59485 100644 --- a/translations/src/main/resources/de.json +++ b/translations/src/main/resources/de.json @@ -7,6 +7,7 @@ "advertisement" : "Umbrella ist ein Produkt von {producer}.", "allowed_states": "zulässige Status", "amount": "Menge", + "archive": "archivieren", "bank_account": "Bankverbindung", "base_url": "Basis-URL", diff --git a/translations/src/main/resources/en.json b/translations/src/main/resources/en.json index af5b1ee..6400400 100644 --- a/translations/src/main/resources/en.json +++ b/translations/src/main/resources/en.json @@ -7,6 +7,7 @@ "advertisement" : "Umbrella is a product of {producer}.", "allowed_states": "allowed states", "amount": "amount", + "archive": "archive", "bank_account": "bank account", "base_url": "base URL",