From ccb84995cbabb6453f76c62dfa584303de1eca3d Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Tue, 25 Nov 2025 10:21:36 +0100 Subject: [PATCH] =?UTF-8?q?document=20db=20no=20longer=20storing=20complet?= =?UTF-8?q?e=20template=20information=20in=20separate=20table:=20-=20dropp?= =?UTF-8?q?ed=20table=20templates=20-=20altered=20table=20documents:=20tem?= =?UTF-8?q?plate=5Fid=20(ref=20into=20templates)=20=E2=86=92=20template=20?= =?UTF-8?q?(name=20of=20template)=20-=20templates=20are=20now=20picked=20u?= =?UTF-8?q?p=20by=20the=20document=20registry?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stephan Richter --- .../umbrella/core/model/Document.java | 15 ++--- .../umbrella/core/model/Template.java | 23 -------- .../umbrella/documents/DocumentApi.java | 8 ++- .../umbrella/documents/DocumentDb.java | 2 - .../umbrella/documents/SqliteDb.java | 59 +++++++------------ .../routes/document/TemplateSelector.svelte | 4 +- frontend/src/routes/document/View.svelte | 2 +- 7 files changed, 37 insertions(+), 76 deletions(-) delete mode 100644 core/src/main/java/de/srsoftware/umbrella/core/model/Template.java 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 5a5591f..a49d254 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 @@ -1,6 +1,7 @@ /* © SRSoftware 2025 */ package de.srsoftware.umbrella.core.model; +import static de.srsoftware.tools.Optionals.emptyIfNull; import static de.srsoftware.umbrella.core.Constants.*; import static de.srsoftware.umbrella.core.Field.*; import static de.srsoftware.umbrella.core.Field.COMPANY; @@ -57,14 +58,14 @@ public final class Document implements Mappable { private final Type type; private LocalDate date; private State state; - private Template template; + private String template; private final Sender sender; private final Customer customer; private final PositionList positions; private final Set dirtyFields = new HashSet<>(); - public Document(long id, long companyId, String number, Type type, LocalDate date, State state, Template template, String delivery, String head, String footer, String currency, String decimalSeparator, Sender sender, Customer customer, PositionList positions) { + public Document(long id, long companyId, String number, Type type, LocalDate date, State state, String template, String delivery, String head, String footer, String currency, String decimalSeparator, Sender sender, Customer customer, PositionList positions) { this.id = id; this.companyId = companyId; this.number = number; @@ -206,7 +207,7 @@ public final class Document implements Mappable { case SENDER: if (json.get(key) instanceof JSONObject nested) sender.patch(nested); break; case STATE: state = State.of(json.getInt(key)).orElseThrow(() -> new UmbrellaException(HTTP_UNPROCESSABLE,"Invalid state")); break; case POS: if (json.get(key) instanceof JSONObject nested) positions.patch(nested); break; - case TEMPLATE_ID: if (json.get(key) instanceof Number num) template = new Template(num.longValue(),companyId,null,null); break; + case TEMPLATE_ID: if (json.get(key) instanceof String templateId) template = templateId; break; default: key = null; } if (key != null) dirtyFields.add(key); @@ -225,7 +226,7 @@ public final class Document implements Mappable { map.put(TYPE, type.name()); map.put(DATE, date); map.put(STATE, state.code); - map.put(DELIVERY, delivery == null ? "" : delivery); + map.put(DELIVERY, emptyIfNull(delivery)); map.put(HEAD, mapMarkdown(head)); map.put(FOOTER, mapMarkdown(footer)); map.put(CURRENCY, currency); @@ -235,7 +236,7 @@ public final class Document implements Mappable { map.put("taxes",positions.taxNetSums(true)); map.put(NET_SUM, netSum()); map.put(GROSS_SUM, grossSum()); - if (template != null) map.put("template", template.toMap()); + map.put("template", emptyIfNull(template)); return map; } @@ -286,7 +287,7 @@ public final class Document implements Mappable { ); } - public Template template() { + public String template() { return template; } @@ -309,7 +310,7 @@ public final class Document implements Mappable { map.put("taxes",positions.taxNetSums(true)); map.put(NET_SUM, netSum()); map.put(GROSS_SUM, grossSum()); - if (template != null) map.put("template", template.toMap()); + if (template != null) map.put("template", template); return map; } diff --git a/core/src/main/java/de/srsoftware/umbrella/core/model/Template.java b/core/src/main/java/de/srsoftware/umbrella/core/model/Template.java deleted file mode 100644 index 4f9ad90..0000000 --- a/core/src/main/java/de/srsoftware/umbrella/core/model/Template.java +++ /dev/null @@ -1,23 +0,0 @@ -/* © SRSoftware 2025 */ -package de.srsoftware.umbrella.core.model; - -import static de.srsoftware.umbrella.core.Constants.*; -import static de.srsoftware.umbrella.core.Field.COMPANY; -import static de.srsoftware.umbrella.core.Field.COMPANY_ID; - -import de.srsoftware.tools.Mappable; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.Map; - -public record Template(long id, long company, String name, byte[] data) implements Mappable { - - public static Template of(ResultSet rs) throws SQLException { - return new Template(rs.getLong(ID),rs.getLong(COMPANY_ID),rs.getString(NAME),rs.getBytes(TEMPLATE)); - } - - @Override - public Map toMap() { - return Map.of(ID,id, COMPANY,company, NAME,name); - } -} 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 bfebea9..93e9555 100644 --- a/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentApi.java +++ b/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentApi.java @@ -363,7 +363,7 @@ public class DocumentApi extends BaseHandler implements DocumentService { } private Content renderDocument(Document document, UmbrellaUser user) throws UmbrellaException { - var template = document.template().name(); + var template = document.template(); var templateName = template+".html.pdf"; var type = document.type().name(); var zugferd = "invoice".equals(type); @@ -517,8 +517,10 @@ public class DocumentApi extends BaseHandler implements DocumentService { if (!(json.has(COMPANY) && json.get(COMPANY) instanceof Number companyId)) throw missingFieldException(COMPANY); var company = companyService().get(companyId.longValue()); if (!companyService().membership(companyId.longValue(),user.id())) throw forbidden("You are not a member of {0}",company.name()); - var templates = db.getCompanyTemplates(companyId.longValue()); - return sendContent(ex,templates.stream().map(Template::toMap)); + var templates = registry.documents() + .filter(d -> d.name().endsWith(".template")) + .map(d -> d.name().replaceAll("(\\.[^.]+)?\\.template$","")); + return sendContent(ex,templates); } private boolean postSearch(HttpExchange ex, UmbrellaUser user) throws IOException { diff --git a/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentDb.java b/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentDb.java index 2745565..394b096 100644 --- a/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentDb.java +++ b/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentDb.java @@ -27,8 +27,6 @@ public interface DocumentDb { CustomerSettings getCustomerSettings(long companyId, Type docType, String customerId) throws UmbrellaException; - Collection